Я пытаюсь использовать класс ClientWebSocket
в Unity 2017.4.10f1, и я получаю ObjectDisposedException
.
Вот код, который я использую:
private async void ContinousReceiveAsync()
{
Debug.Log("Receiving...");
while (State == WebSocketState.Open)
{
List<byte> _buffer = new List<byte>();
WebSocketReceiveResult result = null;
do
{
ArraySegment<byte> _segment = new ArraySegment<byte>(new byte[1024]);
result = await _socket.ReceiveAsync(_segment, CancellationToken.None);
switch (result.MessageType)
{
case WebSocketMessageType.Text:
_buffer.AddRange(_segment.Array);
if(result.EndOfMessage)
TextRecieved(Encoding.UTF8.GetString(_buffer.ToArray()));
break;
case WebSocketMessageType.Binary:
byte[] _data = new byte[result.Count];
Array.Copy(_segment.Array, _data, result.Count);
_buffer.AddRange(_data);
if (result.EndOfMessage)
BinaryRecieved(_buffer.ToArray());
break;
case WebSocketMessageType.Close:
SocketCleanUp(result?.CloseStatus);
if (AutoReconnect)
{
Reconnect();
}
break;
default:
Debug.LogError("[Madapter.Websocket] Unknown WebSocketMessageType");
break;
}
}
while (!result.EndOfMessage);
}
Debug.Log("Stopped Receiving");
}
ReceiveAsync
выдает ObjectDisposedException
объекта System.Net.Sockets.NetworkStream. Это только, но сразу происходит, когда я пытаюсь что-то отправить через веб-сокет.
Вот функция Send
:
public async Task SendTextAsync(string msg)
{
if(State == WebSocketState.Open)
{
ArraySegment<byte> buffer = new ArraySegment<byte>(Encoding.UTF8.GetBytes(msg));
await SendAsync(buffer, WebSocketMessageType.Text);
}
}
public async Task SendBinaryAsync(byte[] data)
{
if (State == WebSocketState.Open)
{
ArraySegment<byte> buffer = new ArraySegment<byte>(data);
await SendAsync(buffer, WebSocketMessageType.Binary);
}
}
private async Task SendAsync(ArraySegment<byte> buffer, WebSocketMessageType type)
{
await _socket.SendAsync(buffer, type, true, CancellationToken.None);
}
И ошибка:
ObjectDisposedException: невозможно получить доступ к удаленному объекту.
Имя объекта: 'System.Net.Sockets.NetworkStream'.
System.Net.WebConnection.Read (запрос System.Net.HttpWebRequest, буфер System.Byte [], смещение System.Int32, размер System.Int32) (по адресу: 0)
System.Net.WebSockets.ClientWebSocket + <> c__DisplayClass35_0.b__0 () (в: 0)
System.Threading.Tasks.Task 1[TResult].InnerInvoke () (at <cfc149f8218b496788d8493c87de777a>:0)
System.Threading.Tasks.Task.Execute () (at <cfc149f8218b496788d8493c87de777a>:0)
--- End of stack trace from previous location where exception was thrown ---
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () (at <cfc149f8218b496788d8493c87de777a>:0)
System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (System.Threading.Tasks.Task task) (at <cfc149f8218b496788d8493c87de777a>:0)
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Threading.Tasks.Task task) (at <cfc149f8218b496788d8493c87de777a>:0)
System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd (System.Threading.Tasks.Task task) (at <cfc149f8218b496788d8493c87de777a>:0)
System.Runtime.CompilerServices.TaskAwaiter
1 [TResult] .GetResult () (в: 0)
Madness.Madapter.WebSocket + c__async5.MoveNext () (в разделе Активы / Инструменты MAD / Madapter / WebSocket.cs: 98)
--- Конец стека трассировки от предыдущего местоположения, где было сгенерировано исключение ---
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () (at: 0)
System.Runtime.CompilerServices.AsyncMethodBuilderCore + <> c.b__6_0 (состояние System.Object) (в: 0)
UnityEngine.UnitySynchronizationContext + WorkRequest.Invoke () (в C: /buildslave/unity/build/Runtime/Export/UnitySynchronizationContext.cs: 92)
UnityEngine.UnitySynchronizationContext.Exec () (в C: /buildslave/unity/build/Runtime/Export/UnitySynchronizationContext.cs: 53)
UnityEngine.UnitySynchronizationContext.ExecuteTasks () (в C: /buildslave/unity/build/Runtime/Export/UnitySynchronizationContext.cs: 74)