Beispiel #1
0
 /// <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);
        }
Beispiel #3
0
 protected virtual void RecvNotify(JObject notifyObj)
 {
     OnReceiving?.Invoke(notifyObj.ToObject <Receiving>());
 }