/// <summary> /// 基本的接收 /// </summary> public void Communicate() { try { if (Interlocked.CompareExchange(ref status, Status.Starting, Status.Stopped) == Status.Stopped) { OnReceiving?.Invoke(this, Empty); while (TcpClient.Connected && TcpClient.Client.IsSocketConnected() && status == Status.Starting && Receive()) { ; } } } catch (Exception e) { Console.WriteLine(e.Message); Console.WriteLine(e.StackTrace); } finally { Interlocked.Exchange(ref status, Status.Stopped); TcpClient.Close(); OnDisconnect?.Invoke(this, Empty); OnReceiving = null; OnMessage = null; OnDisconnect = null; } }
/// <summary> /// WebSocket監聽主程序 /// </summary> /// <param name="context">Http通訊內容</param> /// <param name="socket">WebSocket物件</param> protected async Task Listen(HttpContext context, WebSocket socket) { OnConnected?.Invoke(context, socket); Exception exception = null; //監聽迴圈 while (socket.State == WebSocketState.Open) { List <byte> receiveData = new List <byte>(); WebSocketReceiveResult receiveResult = null; //分段存取迴圈 do { //緩衝區 ArraySegment <byte> buffer = new ArraySegment <byte>(new byte[BufferSize]); try { //接收資料 receiveResult = await socket.ReceiveAsync(buffer, CancellationToken.None); } catch (Exception e) { exception = e; break; } byte[] rawData = buffer.Array.Take(receiveResult.Count).ToArray(); OnReceiving?.Invoke( socket, receiveResult.MessageType, rawData, receiveResult.EndOfMessage); receiveData.AddRange(rawData); } while (!receiveResult.EndOfMessage); OnReceived?.Invoke(socket, receiveResult.MessageType, receiveData.ToArray()); //檢查是否關閉連線,如關閉則跳脫循環監聽 if (exception != null || receiveResult.CloseStatus.HasValue || socket.State != WebSocketState.Open) { break; } } if (exception != null) { OnException?.Invoke(socket, exception); } OnDisconnected?.Invoke(context, socket); }
protected virtual void RecvNotify(JObject notifyObj) { OnReceiving?.Invoke(notifyObj.ToObject <Receiving>()); }