private void Listen()
        {
            // Listen State
            Task.Factory.StartNew(async() =>
            {
                while (true)
                {
                    await Task.Delay(500);
                    if (_socket.State == WebSocketState.Aborted || _socket.State == WebSocketState.Closed)
                    {
                        if (State != SocketIOState.Closed)
                        {
                            State = SocketIOState.Closed;
                            _tokenSource.Cancel();
                            OnClosed?.Invoke(ServerCloseReason.Aborted);
                        }
                    }
                }
            }, _tokenSource.Token);

            // Listen Message
            Task.Factory.StartNew(async() =>
            {
                var buffer = new byte[ReceiveChunkSize];
                while (true)
                {
                    if (_socket.State == WebSocketState.Open)
                    {
                        WebSocketReceiveResult result = await _socket.ReceiveAsync(new ArraySegment <byte>(buffer), _tokenSource.Token);
                        if (result.MessageType == WebSocketMessageType.Text)
                        {
                            var builder = new StringBuilder();
                            string str  = Encoding.UTF8.GetString(buffer, 0, result.Count);
                            builder.Append(str);

                            while (!result.EndOfMessage)
                            {
                                result = await _socket.ReceiveAsync(new ArraySegment <byte>(buffer), _tokenSource.Token);
                                str    = Encoding.UTF8.GetString(buffer, 0, result.Count);
                                builder.Append(str);
                            }

                            var parser = new ResponseTextParser(_namespace, this)
                            {
                                Text = builder.ToString()
                            };
                            await parser.ParseAsync();
                        }
                    }
                }
            }, _tokenSource.Token);
        }
Пример #2
0
        private static async Task Receive(ClientWebSocket webSocket, Action <string> receiveAction)
        {
            byte[] buffer = new byte[2048];
            while (webSocket.State == WebSocketState.Open)
            {
                try
                {
                    var result = await webSocket.ReceiveAsync(new ArraySegment <byte>(buffer), CancellationToken.None);

                    if (result.MessageType == WebSocketMessageType.Close)
                    {
                        await webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, string.Empty, CancellationToken.None);
                    }
                    else
                    {
                        var text = Encoding.UTF8.GetString(buffer).TrimEnd('\0');
                        if (!text.StartsWith("@hello@"))
                        {
                            var arr = text.Split(new string[] { "@_@" }, StringSplitOptions.None);
                            receiveAction("*" + arr[0]);
                        }
                    }
                }
                catch (Exception)
                {
                }
            }
        }
Пример #3
0
        public string Recv()
        {
            ArraySegment <byte>           bytesReceived = new ArraySegment <byte>(new byte[10240]);
            Task <WebSocketReceiveResult> task          = ws.ReceiveAsync(
                bytesReceived, CancellationToken.None);

            task.Wait();
            WebSocketReceiveResult result = task.Result;

            return(Encoding.UTF8.GetString(bytesReceived.Array, 0, result.Count));
        }
Пример #4
0
        private async Task <string> ReceiveFirst()
        {
            byte[] buffer = new byte[1024];
            if (webSocket.State == WebSocketState.Open)
            {
                var result = await webSocket.ReceiveAsync(new ArraySegment <byte>(buffer), CancellationToken.None);

                if (result.MessageType == WebSocketMessageType.Close)
                {
                    await webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, string.Empty, CancellationToken.None);
                }
                else
                {
                    var text = Encoding.UTF8.GetString(buffer).TrimEnd('\0');
                    if (text.StartsWith("hostKey@"))
                    {
                        return(text.Replace("hostKey@", ""));
                    }
                    return(string.Empty);
                }
            }
            return(string.Empty);
        }
Пример #5
0
        //private static async Task Send(ClientWebSocket webSocket)
        //{

        //    while (webSocket.State == WebSocketState.Open)
        //    {
        //        string stringtoSend = Console.ReadLine();
        //        byte[] buffer = encoding.GetBytes(stringtoSend);

        //        await webSocket.SendAsync(new ArraySegment<byte>(buffer), WebSocketMessageType.Binary, false, CancellationToken.None);
        //        Console.WriteLine("Sent:     " + stringtoSend);

        //        await Task.Delay(1000);
        //    }
        //}

        private static async Task ReceiveFirst(ClientWebSocket webSocket, Action <string> receiveAction)
        {
            byte[] buffer = new byte[1024];
            if (webSocket.State == WebSocketState.Open)
            {
                var result = await webSocket.ReceiveAsync(new ArraySegment <byte>(buffer), CancellationToken.None);

                if (result.MessageType == WebSocketMessageType.Close)
                {
                    await webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, string.Empty, CancellationToken.None);
                }
                else
                {
                    var text = Encoding.UTF8.GetString(buffer).TrimEnd('\0');
                    receiveAction(text);
                }
            }
        }
Пример #6
0
        private async Task WatchForMessagesFromServer()
        {
            var buffer = new byte[ReceiveChunkSize];

            try
            {
                while (_clientWebSocket.State == WebSocketState.Open)
                {
                    var stringResult = new StringBuilder();


                    WebSocketReceiveResult result;
                    do
                    {
                        result = await _clientWebSocket.ReceiveAsync(new ArraySegment <byte>(buffer), _cancellationToken);

                        if (result.MessageType == WebSocketMessageType.Close)
                        {
                            await _clientWebSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, string.Empty, CancellationToken.None);

                            CallOnDisconnected();
                        }
                        else
                        {
                            var str = Encoding.UTF8.GetString(buffer, 0, result.Count);
                            stringResult.Append(str);
                        }
                    } while (!result.EndOfMessage);

                    CallOnMessage(stringResult);
                }
            }
            catch (Exception)
            {
                CallOnDisconnected();
            }
            finally
            {
                _clientWebSocket.Dispose();
            }
        }
Пример #7
0
        private async Task receiveLoop()
        {
            byte[] buffer = new byte[2048];
            while (true)
            {
                string json = string.Empty;
                try
                {
                    if (ws == null)
                    {
                        return;
                    }
                    if (ws.State != System.Net.WebSockets.WebSocketState.Open)
                    {
                        OnClose?.Invoke("");
                        return;
                    }
                    System.Net.WebSockets.WebSocketReceiveResult result = await ws.ReceiveAsync(new ArraySegment <byte>(buffer), src.Token);

                    json = Encoding.UTF8.GetString(buffer.Take(result.Count).ToArray());
                    var message = JsonConvert.DeserializeObject <SocketMessage>(json);
                    if (message != null)
                    {
                        _receiveQueue.Add(message);
                    }
                    await ProcessQueue();
                }
                catch (Exception ex)
                {
                    if (ws.State != System.Net.WebSockets.WebSocketState.Open)
                    {
                        OnClose?.Invoke(ex.Message);
                    }
                    else
                    {
                        Log.Error(json);
                        Log.Error(ex, "");
                    }
                }
            }
        }
Пример #8
0
        static async Task TestConnection(string server)
        {
            using (var ws = new System.Net.WebSockets.Managed.ClientWebSocket())
            {
                await ws.ConnectAsync(new Uri(server), CancellationToken.None);

                var buffer   = new ArraySegment <byte>(new byte[1024]);
                var readTask = ws.ReceiveAsync(buffer, CancellationToken.None);

                const string msg     = "hello";
                var          testMsg = new ArraySegment <byte>(Encoding.UTF8.GetBytes(msg));
                await ws.SendAsync(testMsg, WebSocketMessageType.Text, true, CancellationToken.None);

                var read  = await readTask;
                var reply = Encoding.UTF8.GetString(buffer.Array, 0, read.Count);

                if (reply != msg)
                {
                    throw new Exception($"Expected to read back '{msg}' but got '{reply}' for server {server}");
                }
                Console.WriteLine("Success connecting to server " + server);
            }
        }
Пример #9
0
 public async Task <WebSocketReceiveResult> ReceiveAsync(ArraySegment <byte> buffer, CancellationToken cancellationToken)
 {
     return(await _ws.ReceiveAsync(buffer, cancellationToken).ConfigureAwait(false));
 }
Пример #10
0
        private async Task StartReceiving(ClientWebSocket client)
        {
            if (_result != null)
            {
                _result.Clear();
            }

            //单次完整数据
            string msg = "";

            while (true)
            {
                try
                {
                    if (client.CloseStatus == WebSocketCloseStatus.EndpointUnavailable ||
                        client.CloseStatus == WebSocketCloseStatus.InternalServerError ||
                        client.CloseStatus == WebSocketCloseStatus.EndpointUnavailable)
                    {
                        return;
                    }

                    var array   = new byte[4096];
                    var receive = await client.ReceiveAsync(new ArraySegment <byte>(array), CancellationToken.None);

                    if (receive.MessageType == WebSocketMessageType.Text)
                    {
                        if (receive.Count <= 0)
                        {
                            continue;
                        }

                        //string msg = Encoding.UTF8.GetString(array, 0, receive.Count);
                        //在Winform中无法把json一次完整接收,需要判断EndOfMessage的状态。
                        //临时不完整数据
                        string tempMsg = Encoding.UTF8.GetString(array, 0, receive.Count);
                        msg += tempMsg;
                        if (receive.EndOfMessage == false)
                        {
                            continue;
                        }

                        ASRResult result = JsonSerializer.Deserialize <ASRResult>(msg, new JsonSerializerOptions()
                        {
                            PropertyNameCaseInsensitive = true
                        });

                        //清空数据
                        msg = "";

                        if (result.Code != 0)
                        {
                            throw new Exception($"Result error({result.Code}): {result.Message}");
                        }
                        if (result.Data == null ||
                            result.Data.result == null ||
                            result.Data.result.ws == null)
                        {
                            return;
                        }
                        //分析数据
                        StringBuilder itemStringBuilder = new StringBuilder();
                        foreach (var item in result.Data.result.ws)
                        {
                            foreach (var child in item.cw)
                            {
                                if (string.IsNullOrEmpty(child.w))
                                {
                                    continue;
                                }
                                itemStringBuilder.Append(child.w);
                            }
                        }
                        if (result.Data.result.pgs == "apd")
                        {
                            _result.Add(new ResultWPGSInfo()
                            {
                                sn   = result.Data.result.sn,
                                data = itemStringBuilder.ToString()
                            });
                        }
                        else if (result.Data.result.pgs == "rpl")
                        {
                            if (result.Data.result.rg == null || result.Data.result.rg.Count != 2)
                            {
                                continue;
                            }
                            int first = result.Data.result.rg[0];
                            int end   = result.Data.result.rg[1];
                            try
                            {
                                ResultWPGSInfo item = _result.Where(p => p.sn >= first && p.sn <= end).SingleOrDefault();
                                if (item == null)
                                {
                                    continue;
                                }
                                else
                                {
                                    item.sn   = result.Data.result.sn;
                                    item.data = itemStringBuilder.ToString();
                                }
                            }
                            catch
                            {
                                continue;
                            }
                        }

                        StringBuilder totalStringBuilder = new StringBuilder();
                        foreach (var item in _result)
                        {
                            totalStringBuilder.Append(item.data);
                        }

                        OnMessage?.Invoke(this, totalStringBuilder.ToString());
                        //最后一帧,结束
                        if (result.Data.status == 2)
                        {
                            return;
                        }
                    }
                }
                catch (WebSocketException)
                {
                    return;
                }
                catch (Exception ex)
                {
                    //服务器主动断开连接
                    if (!ex.Message.ToLower().Contains("unable to read data from the transport connection"))
                    {
                        OnError?.Invoke(this, new ErrorEventArgs()
                        {
                            Code      = ResultCode.Error,
                            Message   = ex.Message,
                            Exception = ex,
                        });
                    }
                    return;
                }
            }
        }
Пример #11
0
        //private async Task<WebSocketReceiveResult> SendCmdAsync(CdpMsg msg)
        private async Task <string> SendCmdAsync(CdpMsg msg)
        {
            try
            {
                using (ClientWebSocket ws = new ClientWebSocket())
                {
                    Log($"CdpClient.SendMsg(): Attempting to send cmd {msg.method}, port is {_chromeDebuggingPort}");

                    // load config
                    await CdpConfig.LoadConfigAsync().ConfigureAwait(false);

                    byte[] receiveBytes  = new byte[65536];
                    var    receiveBuffer = new ArraySegment <byte>(receiveBytes);
                    ws.Options.SetBuffer(65536, 65536);                     // (receive 64KB, send 64KB)

#if DEBUG
                    var tokenSource = new CancellationTokenSource(600000);                      // 10 mins
#else
                    var tokenSource = new CancellationTokenSource(10000);                       // 10 secs
#endif
                    CancellationToken cancellationToken = tokenSource.Token;

                    Uri wsUri;
                    if (msg.method.StartsWith("Browser"))
                    {
                        wsUri = this.CdpConfig.BrowserWsUri;
                    }
                    else
                    {
                        wsUri = this.CdpConfig.PageWsUri;
                    }

                    Log($"CdpClient.SendMsg(): Attempting to connect to uri {wsUri}, port is {_chromeDebuggingPort}...");
                    await ws.ConnectAsync(wsUri, cancellationToken).ConfigureAwait(false);

                    Log($"CdpClient.SendMsg(): ...Connected to to uri {wsUri}, port is {_chromeDebuggingPort}");

                    string json  = Json.Serialize <CdpMsg>(msg);
                    byte[] bytes = Encoding.UTF8.GetBytes(json);
                    ArraySegment <byte> sendBuffer = new ArraySegment <byte>(bytes);

                    Log($"About to send CDP cmd {msg.method} to port {_chromeDebuggingPort}...");
                    await ws.SendAsync(sendBuffer, WebSocketMessageType.Text, true, cancellationToken).ConfigureAwait(false);

                    WebSocketReceiveResult result = await ws.ReceiveAsync(receiveBuffer, cancellationToken).ConfigureAwait(false);

                    Log($"...received CDP result for cmd {msg.method}, result = {Json.Serialize(result)}, port is {_chromeDebuggingPort}");

                    // retrive result from buffer
                    if (result.MessageType != WebSocketMessageType.Text)
                    {
                        return($"Unexpected message type: {result.MessageType}");
                    }

                    string msgText = Encoding.UTF8.GetString(receiveBytes, 0, result.Count);
                    Log($"{msg.method}(): returned result {msgText}, port is {_chromeDebuggingPort}");

                    return(msgText);
                }
            }
            catch (Exception ex)
            {
                Log($"Exception occurred: {ex.ToString()}");
                return(null);
            }
        }
Пример #12
0
        private async Task ListenAsync()
        {
            while (true)
            {
                var buffer = new byte[ReceiveChunkSize];
                int count  = 0;
                WebSocketReceiveResult result = null;
                while (_ws.State == WebSocketState.Open)
                {
                    try
                    {
                        //result = await _ws.ReceiveAsync(new ArraySegment<byte>(buffer), _wsWorkTokenSource.Token);
                        var subBuffer = new byte[ReceiveChunkSize];
                        result = await _ws.ReceiveAsync(new ArraySegment <byte>(subBuffer), CancellationToken.None);

                        if (result.MessageType == WebSocketMessageType.Close)
                        {
                            Close("io server disconnect");
                            break;
                        }
                        else if (result.MessageType == WebSocketMessageType.Text || result.MessageType == WebSocketMessageType.Binary)
                        {
                            if (buffer.Length - count < result.Count)
                            {
                                Array.Resize(ref buffer, buffer.Length + result.Count);
                            }
                            Buffer.BlockCopy(subBuffer, 0, buffer, count, result.Count);
                            count += result.Count;
                        }
                        if (result.EndOfMessage)
                        {
                            break;
                        }
                    }
                    catch (WebSocketException e)
                    {
                        Close(e.Message);
                        break;
                    }
                }
                if (result == null)
                {
                    break;
                }
                if (result.MessageType == WebSocketMessageType.Text)
                {
                    string message = Encoding.UTF8.GetString(buffer, 0, count);
#if DEBUG
                    System.Diagnostics.Trace.WriteLine($"⬇ {DateTime.Now} {message}");
#endif
                    processor.Process(new MessageContext
                    {
                        Message  = message,
                        SocketIO = _io
                    });
                }
                else if (result.MessageType == WebSocketMessageType.Binary)
                {
#if DEBUG
                    System.Diagnostics.Trace.WriteLine($"⬇ {DateTime.Now} Binary message");
#endif
                    byte[] bytes;
                    if (_io.Options.EIO == 3)
                    {
                        count -= 1;
                        bytes  = new byte[count];
                        Buffer.BlockCopy(buffer, 1, bytes, 0, count);
                    }
                    else
                    {
                        bytes = new byte[count];
                        Buffer.BlockCopy(buffer, 0, bytes, 0, count);
                    }
                    _io.InvokeBytesReceived(bytes);
                }
            }
        }