public async Task RunInboxAsync()
        {
            while (true)
            {
                try
                {
                    if (Socket.State != WebSocketState.Open)
                    {
                        break;
                    }

                    var receivedString = await WebSocketUtils.ReceiveStringAsync(Socket, cancellationToken);

                    if (string.IsNullOrEmpty(receivedString))
                    {
                        continue;
                    }

                    Console.WriteLine(receivedString);

                    if (receivedString.StartsWith("MUSE:"))
                    {
                        string museJsonMessage = receivedString.Substring(5);

                        HandleMessage(museJsonMessage);

                        continue;
                    }
                }
                catch (Exception e)
                {
                    Console.Error.WriteLine(e.Message, e.StackTrace);
                }
            }
        }
        private void Init()
        {
            var webSocket = _webSocket = HuobiWebSocketClient.GetWebSocket();

            webSocket.OnMessage += (sender, e) => {
                var data = GZipDecompresser.Decompress(e.RawData);
                if (data.Contains("ping"))
                {
                    webSocket.Send(data.Replace("ping", "pong"));
                }
                else
                {
                    try {
                        var updateEvent = Json.Deserialize <DepthTickUpdateEvent>(data);
                        _cache[updateEvent.Ch] = updateEvent.Tick;
                    }
                    catch (Exception) {
                        // ignored
                    }
                }
            };
            webSocket.OnClose += (sender, e) => _cache.Clear();
            webSocket.OnError += (sender, e) => WebSocketUtils.CloseWebSocket(webSocket);
            webSocket.Connect();
        }
        public async Task RunOutboxAsync()
        {
            while (true)
            {
                try
                {
                    if (Socket.State != WebSocketState.Open)
                    {
                        break;
                    }

                    // Send messages from the outbox.

                    string message = null;

                    while (Outbox.TryDequeue(out message))
                    {
                        await WebSocketUtils.SendStringAsync(Socket, message, cancellationToken);
                    }
                }
                catch (Exception e)
                {
                    Console.Error.WriteLine(e.Message, e.StackTrace);
                }
            }
        }
 /// <summary>
 /// Create a new instance of <see cref="WebSocketUpgradeRequest"/>.
 /// </summary>
 public WebSocketUpgradeRequest()
     : base("GET", "/", "HTTP/1.1")
 {
     Headers["Upgrade"]               = "websocket";
     Headers["Connection"]            = "Upgrade";
     Headers["Sec-WebSocket-Key"]     = WebSocketUtils.CreateWebSocketKey();
     Headers["Sec-WebSocket-Version"] = "13";
 }
Exemple #5
0
        public WebSocketFrame Read(Stream stream, WebSocketClient client)
        {
            byte first;

            try {
                first = (byte)stream.ReadByte();
            } catch (Exception e) {
                return(null);
            }

            if (!WebSocketUtils.IsClientConnected(client))
            {
                return(null);
            }

            byte bitFinFlag = 0x80;
            byte opcodeFlag = 0x0F;

            bool            bitFinSet = (first & bitFinFlag) == bitFinFlag;
            WebSocketOpcode opcode    = (WebSocketOpcode)(first & opcodeFlag);

            byte bitMaskFlag = 0x80;
            byte second      = (byte)stream.ReadByte();

            bool bitMaskSet = (second & bitMaskFlag) == bitMaskFlag;
            uint length     = ReadLength(stream, second);

            if (length != 0)
            {
                byte[] decoded;

                if (bitMaskSet)
                {
                    byte[] key     = WebSocketReaderWriter.Read(stream, 4);
                    byte[] encoded = WebSocketReaderWriter.Read(stream, length);

                    decoded = new byte[length];

                    for (int i = 0; i < encoded.Length; i++)
                    {
                        decoded[i] = (byte)(encoded[i] ^ key[i % 4]);
                    }
                }
                else
                {
                    decoded = WebSocketReaderWriter.Read(stream, length);
                }

                WebSocketFrame frame = new WebSocketFrame(opcode, decoded);

                return(frame);
            }

            return(null);
        }
        private void SetTimer()
        {
            var timer = new System.Timers.Timer(5000);

            timer.Elapsed += (a, b) => {
                if (_webSocket.IsAlive)
                {
                    return;
                }
                WebSocketUtils.CloseWebSocket(_webSocket);
                _cache.Clear();
                Init();
            };
            timer.AutoReset = true;
            timer.Enabled   = true;
        }
        private void Init()
        {
            var webSocket = _webSocket = HuobiWebSocketClient.GetWebSocket();

            webSocket.OnMessage += (sender, e) => {
                var data = GZipDecompresser.Decompress(e.RawData);
                if (data.Contains("ping"))
                {
                    webSocket.Send(data.Replace("ping", "pong"));
                }
                else
                {
                    try {
                        var updateEvent = Json.Deserialize <TrickUpdateEvent>(data);
                        if (!_cache.ContainsKey(updateEvent.Ch))
                        {
                            lock (this) {
                                if (!_cache.ContainsKey(updateEvent.Ch))
                                {
                                    _cache[updateEvent.Ch] = SortedDictionaryFactory.NewSortedDictionary();
                                }
                            }
                        }

                        var ticks = _cache[updateEvent.Ch];
                        ticks[updateEvent.Tick.Id] = updateEvent.Tick;
                        while (ticks.Count > Size)
                        {
                            ticks.Remove(ticks.Last().Key);
                        }
                    }
                    catch (Exception) {
                        // ignored
                    }
                }
            };
            webSocket.OnClose += (sender, e) => _cache.Clear();
            webSocket.OnError += (sender, e) => WebSocketUtils.CloseWebSocket(webSocket);
            webSocket.Connect();
        }
Exemple #8
0
        public void Send(string connectionId, byte[] buffer)
        {
            UserTokenEventArgs userToken = UserDic.Get(connectionId);

            if (userToken == null || userToken.UserSocket == null)
            {
                return;
            }
            if (userToken.ClientType == ClientType.WebSocket)
            {
                buffer = WebSocketUtils.PackServerData(buffer);//或者使用DataFram
            }
            SocketAsyncEventArgs sendEventArgs = null;

            if (this.sendStackPool.TryPop(out sendEventArgs))
            {
                try
                {
                    sendEventArgs.UserToken = userToken;
                    sendEventArgs.SetBuffer(buffer, 0, buffer.Length);//最后设置发送数据
                    //异步发送数据
                    //Array.Copy(buffer, 0, sendEventArgs.Buffer, 0, buffer.Length);//设置发送数据
                    bool willRaiseEvent = userToken.UserSocket.SendAsync(sendEventArgs);//采用异步发送才能处理sendStackPool
                    if (!willRaiseEvent)
                    {
                        ProcessSend(sendEventArgs);
                    }
                }
                catch (ObjectDisposedException)//调用此处的异步发送可能socket被其他进程关闭异常
                {
                    RaiseDisconnectedEvent(userToken);
                }
                catch (Exception ex)
                {
                    RaiseErrorEvent(userToken, ex);
                    RaiseDisconnectedEvent(userToken);
                }
            }
        }
        private void Init()
        {
            var webSocket = _webSocket = HuobiWebSocketClient.GetWebSocket();

            webSocket.OnMessage += (sender, e) => {
                var data = GZipDecompresser.Decompress(e.RawData);
                if (data.Contains("ping"))
                {
                    (sender as WebSocket)?.Send(data.Replace("ping", "pong"));
                }
                else
                {
                    try {
                        var updateEvent = Json.Deserialize <TradeTickUpdateEvent>(data);
                        if (!_cache.ContainsKey(updateEvent.Ch))
                        {
                            _cache[updateEvent.Ch] = new ConcurrentQueue <TradeData>();
                        }

                        foreach (var tradeData in updateEvent.Tick.Data)
                        {
                            _cache[updateEvent.Ch].Enqueue(tradeData);
                        }

                        while (_cache[updateEvent.Ch].Count > 100)
                        {
                            _cache[updateEvent.Ch].TryDequeue(out _);
                        }
                    }
                    catch (Exception exception) {
                        Console.WriteLine(exception);
                    }
                }
            };
            webSocket.OnClose += (sender, e) => _cache.Clear();
            webSocket.OnError += (sender, e) => WebSocketUtils.CloseWebSocket(webSocket);
            webSocket.Connect();
        }
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            //TODO: fix this hack
            filterContext.HttpContext.Response.Content = new HttpStringContent(" ");

            if (filterContext.HttpContext.RouteUri == null)
            {
                filterContext.Result = new HttpStatusCodeResult(HttpStatusCode.BadRequest, "Bad Request");
                return;
            }

            if (this.Request.Headers.Contains(new KeyValuePair <string, string>("Upgrade", "Websocket")) &&
                this.Request.Headers.Contains(new KeyValuePair <string, string>("Connection", "Upgrade")))
            {
                string webSocketVersion;
                this.Request.Headers.TryGetValue("Sec-WebSocket-Version", out webSocketVersion);
                if (webSocketVersion != "13")
                {
                    filterContext.Result = new HttpStatusCodeResult(HttpStatusCode.BadRequest, "Invalid Websocket Version");
                    return;
                }

                string webSocketKey;
                if (this.Request.Headers.TryGetValue("Sec-WebSocket-Key", out webSocketKey))
                {
                    filterContext.HttpContext.Response.Headers.Add("Upgrade", "Websocket");
                    filterContext.HttpContext.Response.Headers.Add("Sec-WebSocket-Accept", WebSocketUtils.HashWebSocketKey(webSocketKey));
                    filterContext.HttpContext.Response.Headers.Add("Sec-WebSocket-Location", "ws://localhost:8181/websession");

                    string webSocketOrigin;
                    this.Request.Headers.TryGetValue("Sec-WebSocket-Origin", out webSocketOrigin);
                    if (webSocketOrigin != null)
                    {
                        filterContext.HttpContext.Response.Headers.Add("Sec-WebSocket-Origin", webSocketOrigin);
                    }

                    filterContext.Result = new HttpStatusCodeResult(HttpStatusCode.SwitchingProtocols, "WebSocket Protocol Handshake");

                    base.OnActionExecuting(filterContext);
                }
            }
        }
        /// <summary>
        /// Handle the request.
        /// </summary>
        /// <param name="context">HTTP context</param>
        /// <returns><see cref="ModuleResult.Stop"/> will stop all processing except <see cref="IHttpModule.EndRequest"/>.</returns>
        /// <remarks>Invoked in turn for all modules unless you return <see cref="ModuleResult.Stop"/>.</remarks>
        public ModuleResult HandleRequest(IHttpContext context)
        {
            if (context.RouteUri == null)
            {
                context.Response.StatusCode   = HttpStatusCode.BadRequest;
                context.Response.ReasonPhrase = "Bad Request";
                return(ModuleResult.Stop);
            }

            // only handle GET requests
            if (context.Response.RequestMessage.Method != HttpMethod.Get)
            {
                return(ModuleResult.Continue);
            }

            if (context.RouteUri.AbsolutePath == _uriEndPoint)
            {
                HttpRequestMessage httpMessage = context.Response.RequestMessage;

                if (httpMessage.Headers.Contains(new KeyValuePair <string, string>("Upgrade", "Websocket")) &&
                    httpMessage.Headers.Contains(new KeyValuePair <string, string>("Connection", "Upgrade")))
                {
                    string webSocketVersion;
                    httpMessage.Headers.TryGetValue("Sec-WebSocket-Version", out webSocketVersion);
                    if (webSocketVersion != "13")
                    {
                        context.Response.StatusCode   = HttpStatusCode.BadRequest;
                        context.Response.ReasonPhrase = "Invalid Websocket Version";
                        return(ModuleResult.Stop);
                    }

                    string webSocketKey;
                    if (httpMessage.Headers.TryGetValue("Sec-WebSocket-Key", out webSocketKey))
                    {
                        context.Response.StatusCode   = HttpStatusCode.SwitchingProtocols;
                        context.Response.ReasonPhrase = "WebSocket Protocol Handshake";
                        context.Response.Headers.Add("Upgrade", "Websocket");
                        context.Response.Headers.Add("Sec-WebSocket-Accept", WebSocketUtils.HashWebSocketKey(webSocketKey));
                        context.Response.Headers.Add("Sec-WebSocket-Location", "ws://localhost:8181/websession");

                        string webSocketOrigin;
                        httpMessage.Headers.TryGetValue("Sec-WebSocket-Origin", out webSocketOrigin);
                        if (webSocketOrigin != null)
                        {
                            context.Response.Headers.Add("Sec-WebSocket-Origin", webSocketOrigin);
                        }

                        context.Response.Content = new HttpStringContent("Switching Protocols");



                        //IWebSocketMessage webSocketMessage = msg as IWebSocketMessage;
                        //if (webSocketMessage != null)
                        //{
                        //    // standard message responses handled by listener
                        //    switch (webSocketMessage.Opcode)
                        //    {
                        //        case WebSocketOpcode.Ping:
                        //            source.Send(new WebSocketMessage(WebSocketOpcode.Pong, webSocketMessage.Payload));
                        //            return;
                        //        case WebSocketOpcode.Close:
                        //            source.Send(new WebSocketMessage(WebSocketOpcode.Close));
                        //            source.Close();

                        //            WebSocketClientDisconnected(this,
                        //                new ClientDisconnectedEventArgs(source, new Exception("WebSocket closed")));
                        //            return;
                        //    }

                        //    _webSocketMessageReceived(source, webSocketMessage);
                        //    return;



                        return(ModuleResult.Stop);
                    }
                    else
                    {
                        context.Response.StatusCode   = HttpStatusCode.BadRequest;
                        context.Response.ReasonPhrase = "Bad Request";
                        return(ModuleResult.Stop);
                    }
                }
            }
            return(ModuleResult.Continue);
        }