Browse Source

Fixed built-in websocket reuse

pull/6/head
RogueException 9 years ago
parent
commit
f571e0bec0
1 changed files with 11 additions and 9 deletions
  1. +11
    -9
      src/Discord.Net/Net/WebSockets/WebSocket.BuiltIn.cs

+ 11
- 9
src/Discord.Net/Net/WebSockets/WebSocket.BuiltIn.cs View File

@@ -17,9 +17,9 @@ namespace Discord.Net.WebSockets
private const int HR_TIMEOUT = -2147012894; private const int HR_TIMEOUT = -2147012894;


private readonly ConcurrentQueue<byte[]> _sendQueue; private readonly ConcurrentQueue<byte[]> _sendQueue;
private readonly ClientWebSocket _webSocket;
private readonly int _sendInterval; private readonly int _sendInterval;
private ClientWebSocket _webSocket;

public event EventHandler<WebSocketMessageEventArgs> ProcessMessage; public event EventHandler<WebSocketMessageEventArgs> ProcessMessage;
private void RaiseProcessMessage(string msg) private void RaiseProcessMessage(string msg)
{ {
@@ -31,12 +31,12 @@ namespace Discord.Net.WebSockets
{ {
_sendInterval = sendInterval; _sendInterval = sendInterval;
_sendQueue = new ConcurrentQueue<byte[]>(); _sendQueue = new ConcurrentQueue<byte[]>();
_webSocket = new ClientWebSocket();
_webSocket.Options.KeepAliveInterval = TimeSpan.Zero;
} }


public Task Connect(string host, CancellationToken cancelToken) public Task Connect(string host, CancellationToken cancelToken)
{ {
_webSocket = new ClientWebSocket();
_webSocket.Options.KeepAliveInterval = TimeSpan.Zero;
return _webSocket.ConnectAsync(new Uri(host), cancelToken); return _webSocket.ConnectAsync(new Uri(host), cancelToken);
} }


@@ -44,7 +44,9 @@ namespace Discord.Net.WebSockets
{ {
byte[] ignored; byte[] ignored;
while (_sendQueue.TryDequeue(out ignored)) { } while (_sendQueue.TryDequeue(out ignored)) { }
return TaskHelper.CompletedTask;
_webSocket.Dispose();
_webSocket = new ClientWebSocket();
return TaskHelper.CompletedTask;
} }


public Task[] RunTasks(CancellationToken cancelToken) public Task[] RunTasks(CancellationToken cancelToken)
@@ -60,7 +62,7 @@ namespace Discord.Net.WebSockets
{ {
return Task.Run(async () => return Task.Run(async () =>
{ {
var buffer = new ArraySegment<byte>(new byte[ReceiveChunkSize]);
var buffer = new byte[ReceiveChunkSize]; //new ArraySegment<byte>(new byte[ReceiveChunkSize]);
var builder = new StringBuilder(); var builder = new StringBuilder();


try try
@@ -75,7 +77,7 @@ namespace Discord.Net.WebSockets


try try
{ {
result = await _webSocket.ReceiveAsync(buffer, cancelToken).ConfigureAwait(false);
result = await _webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), cancelToken).ConfigureAwait(false);
} }
catch (Win32Exception ex) when (ex.HResult == HR_TIMEOUT) catch (Win32Exception ex) when (ex.HResult == HR_TIMEOUT)
{ {
@@ -85,11 +87,11 @@ namespace Discord.Net.WebSockets
if (result.MessageType == WebSocketMessageType.Close) if (result.MessageType == WebSocketMessageType.Close)
throw new Exception($"Got Close Message ({result.CloseStatus?.ToString() ?? "Unexpected"}, {result.CloseStatusDescription ?? "No Reason"})"); throw new Exception($"Got Close Message ({result.CloseStatus?.ToString() ?? "Unexpected"}, {result.CloseStatusDescription ?? "No Reason"})");
else else
builder.Append(Encoding.UTF8.GetString(buffer.Array, buffer.Offset, result.Count));
builder.Append(Encoding.UTF8.GetString(buffer, 0, result.Count));


} }
while (result == null || !result.EndOfMessage); while (result == null || !result.EndOfMessage);
RaiseProcessMessage(builder.ToString()); RaiseProcessMessage(builder.ToString());


builder.Clear(); builder.Clear();


Loading…
Cancel
Save