mirror of
https://github.com/dotnet/MQTTnet.git
synced 2026-10-30 18:56:30 +08:00
Refactor web socket stream. Add mqtt as default sub protocol.
This commit is contained in:
@@ -9,7 +9,7 @@ namespace MQTTnet.Client
|
|||||||
|
|
||||||
public IDictionary<string, string> RequestHeaders { get; set; }
|
public IDictionary<string, string> RequestHeaders { get; set; }
|
||||||
|
|
||||||
public ICollection<string> SubProtocols { get; set; }
|
public ICollection<string> SubProtocols { get; set; } = new List<string> { "mqtt" };
|
||||||
|
|
||||||
public CookieContainer CookieContainer { get; set; }
|
public CookieContainer CookieContainer { get; set; }
|
||||||
|
|
||||||
|
|||||||
@@ -11,9 +11,9 @@ namespace MQTTnet.Implementations
|
|||||||
{
|
{
|
||||||
public class WebSocketStream : Stream
|
public class WebSocketStream : Stream
|
||||||
{
|
{
|
||||||
private readonly WebSocket _webSocket;
|
private readonly byte[] _chunckBuffer = new byte[MqttWebSocketChannel.BufferSize];
|
||||||
private readonly byte[] _chunkBuffer = new byte[MqttWebSocketChannel.BufferSize];
|
|
||||||
private readonly Queue<byte> _buffer = new Queue<byte>(MqttWebSocketChannel.BufferSize);
|
private readonly Queue<byte> _buffer = new Queue<byte>(MqttWebSocketChannel.BufferSize);
|
||||||
|
private readonly WebSocket _webSocket;
|
||||||
|
|
||||||
public WebSocketStream(WebSocket webSocket)
|
public WebSocketStream(WebSocket webSocket)
|
||||||
{
|
{
|
||||||
@@ -55,25 +55,28 @@ namespace MQTTnet.Implementations
|
|||||||
// Use existing date from buffer.
|
// Use existing date from buffer.
|
||||||
while (count > 0 && _buffer.Any())
|
while (count > 0 && _buffer.Any())
|
||||||
{
|
{
|
||||||
buffer[offset++] = _buffer.Dequeue();
|
buffer[offset] = _buffer.Dequeue();
|
||||||
count--;
|
count--;
|
||||||
bytesRead++;
|
bytesRead++;
|
||||||
|
offset++;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (count == 0)
|
if (count == 0)
|
||||||
{
|
{
|
||||||
return bytesRead;
|
return bytesRead;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Fetch new data if the buffer is not full.
|
||||||
while (_webSocket.State == WebSocketState.Open)
|
while (_webSocket.State == WebSocketState.Open)
|
||||||
{
|
{
|
||||||
await FetchChunkAsync(cancellationToken);
|
await FetchChunkAsync(cancellationToken).ConfigureAwait(false);
|
||||||
|
|
||||||
while (count > 0 && _buffer.Any())
|
while (count > 0 && _buffer.Any())
|
||||||
{
|
{
|
||||||
buffer[offset++] = _buffer.Dequeue();
|
buffer[offset] = _buffer.Dequeue();
|
||||||
count--;
|
count--;
|
||||||
bytesRead++;
|
bytesRead++;
|
||||||
|
offset++;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (count == 0)
|
if (count == 0)
|
||||||
@@ -111,19 +114,24 @@ namespace MQTTnet.Implementations
|
|||||||
}
|
}
|
||||||
|
|
||||||
private async Task FetchChunkAsync(CancellationToken cancellationToken)
|
private async Task FetchChunkAsync(CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
var response = await _webSocket.ReceiveAsync(new ArraySegment<byte>(_chunkBuffer, 0, _chunkBuffer.Length), cancellationToken).ConfigureAwait(false);
|
var response = await _webSocket.ReceiveAsync(new ArraySegment<byte>(_chunckBuffer, 0, _chunckBuffer.Length), cancellationToken).ConfigureAwait(false);
|
||||||
|
|
||||||
for (var i = 0; i < response.Count; i++)
|
|
||||||
{
|
|
||||||
var @byte = _chunkBuffer[i];
|
|
||||||
_buffer.Enqueue(@byte);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (response.MessageType == WebSocketMessageType.Close)
|
if (response.MessageType == WebSocketMessageType.Close)
|
||||||
{
|
{
|
||||||
await _webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, string.Empty, cancellationToken).ConfigureAwait(false);
|
await _webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, string.Empty, cancellationToken).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
|
else if (response.MessageType == WebSocketMessageType.Binary)
|
||||||
|
{
|
||||||
|
for (var i = 0; i < response.Count; i++)
|
||||||
|
{
|
||||||
|
_buffer.Enqueue(_chunckBuffer[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (response.MessageType == WebSocketMessageType.Text)
|
||||||
|
{
|
||||||
|
throw new MqttProtocolViolationException("WebSocket channel received TEXT message.");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user