예제 #1
0
 public ChatMessagesBusinessTest()
 {
     connectionManager       = new ConnectionManager();
     webSocketMessageHandler = new WebSocketMessageHandler(connectionManager);
     chatUsersRepository     = new Mock <IChatUsersRepository>();
     channelRepository       = new Mock <IChannelRepository>();
 }
    private const int LengthOfStringQuotes = 2; // ""

    public WebSocketMessageHandlerTests(IJsonRpcMessageFormatter formatter, ITestOutputHelper logger)
        : base(logger)
    {
        this.socket    = new MockWebSocket();
        this.formatter = formatter;
        this.handler   = new WebSocketMessageHandler(this.socket, this.formatter, BufferSize);
    }
예제 #3
0
        static async Task Main(string[] args)
        {
            using (var webSocket = new ClientWebSocket())
            {
                Console.WriteLine("正在与服务端建立连接...");
                var uri = new Uri("ws://localhost:5000/rpc/greeter");
                await webSocket.ConnectAsync(uri, CancellationToken.None);

                Console.WriteLine("已建立连接");

                Console.WriteLine("开始向服务端发送消息...");
                var messageHandler = new WebSocketMessageHandler(webSocket);
                var greeterClient  = JsonRpc.Attach <IGreeter>(messageHandler);
                var request        = new HelloRequest {
                    Name = "精致码农"
                };
                var response = await greeterClient.SayHelloAsync(request);

                Console.WriteLine($"收到来自服务端的响应:{response.Message}");

                Console.WriteLine("正在断开连接...");
                await webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "断开连接", CancellationToken.None);

                Console.WriteLine("已断开连接");
            }

            Console.ReadKey();
        }
예제 #4
0
        /// <summary>
        /// Connect to Binance Websocket Market Streams.
        /// </summary>
        /// <typeparam name="T">Type of stream message to return.</typeparam>
        /// <param name="streamName">Stream Name to send Web Socket.</param>
        /// <param name="webSocketMessageHandler">Callback for receive message.</param>
        public void ConnectToWebSocketMarketStreams <T>(string streamName, WebSocketMessageHandler <T> webSocketMessageHandler)
        {
            var targetURI = BinanceConstants.WEBSOCKET_BASE_ENDPOINT_URL + streamName;

            var ws = new WebSocket(targetURI);

            ws.OnMessage += (sender, e) =>
            {
                var responseData = JsonConvert.DeserializeObject <T>(e.Data);

                webSocketMessageHandler(responseData);
            };

            ws.OnError += (sender, e) =>
            {
                _socketList.Remove(ws);
            };

            ws.OnClose += (sender, e) =>
            {
                _socketList.Remove(ws);
            };

            ws.Connect();
            _socketList.Add(ws);
        }
 public WebSocketManagerMiddleware(RequestDelegate next, WebSocketMessageHandler webSocketHandler, IHttpContextAccessor httpContextAccessor, ILogger <WebSocketManagerMiddleware> logger, IConfiguration configuration)
 {
     _configuration       = configuration;
     _next                = next;
     _webSocketHandler    = webSocketHandler;
     _httpContextAccessor = httpContextAccessor;
     _logger              = logger;
 }
예제 #6
0
 public SenparcWebSocketHubBase()
 {
     if (WebSocket.WebSocketConfig.WebSocketMessageHandlerFunc == null)
     {
         throw new WebSocketExceptionBase("WebSocket.WebSocketConfig.WebSocketMessageHandlerFunc 不能为 null!");
     }
     _webSocketMessageHandler = WebSocket.WebSocketConfig.WebSocketMessageHandlerFunc();
 }
예제 #7
0
 public ChatMessagesBusiness(IChatUsersRepository chatUsersRepository, WebSocketMessageHandler webSocketMessageHandler, ConnectionManager connectionManager,
                             IChannelRepository channelRepository)
 {
     this.chatUsersRepository     = chatUsersRepository;
     this.webSocketMessageHandler = webSocketMessageHandler;
     this.connectionManager       = connectionManager;
     this.channelRepository       = channelRepository;
 }
예제 #8
0
        private void ConnectWebSocketEndpoint <T>(Uri endpoint, WebSocketMessageHandler <T> messageHandler, ResponseParseHandler <T> customParseHandler = null) where T : WebSocketMessageBase
        {
            var ws = CreateNewWebSocket(endpoint);

            ws.OnMessage += (sender, e) =>
            {
                logger.Debug("Msg: " + e.Data);
                var eventData = customParseHandler == null?
                                JsonConvert.DeserializeObject <T>(e.Data) :
                                    customParseHandler(e.Data);

                messageHandler(eventData);
            };
            ws.Connect();
            ActiveSockets.Add(ws);
        }
예제 #9
0
        public async Task <string> ConnectUserDataEndpoint(BinanceClient client, WebSocketMessageHandler <WsUserDataAccountUpdateMessage> accountUpdateHandler,
                                                           WebSocketMessageHandler <WsUserDataOrderUpdateMessage> orderUpdateHandler, WebSocketMessageHandler <WsUserDataTradeUpdateMessage> tradeUpdateHandler)
        {
            var listenKey = await client.StartUserDataStream();

            var endpoint = GetWsEndpoint(string.Empty, listenKey);
            var ws       = CreateNewWebSocket(endpoint, listenKey);

            ws.OnMessage += (sender, e) =>
            {
                logger.Debug("Msg: " + e.Data);
                var responseObject = JObject.Parse(e.Data);
                var eventType      = (string)responseObject["e"];

                switch (eventType)
                {
                case "outboundAccountInfo":
                    accountUpdateHandler(JsonConvert.DeserializeObject <WsUserDataAccountUpdateMessage>(e.Data));
                    return;

                case "executionReport":
                    var executionType = (string)responseObject["x"];
                    if (executionType == ExecutionType.Trade)
                    {
                        tradeUpdateHandler(JsonConvert.DeserializeObject <WsUserDataTradeUpdateMessage>(e.Data));
                        return;
                    }
                    orderUpdateHandler(JsonConvert.DeserializeObject <WsUserDataOrderUpdateMessage>(e.Data));
                    return;

                default:
                    throw new ApplicationException("Unexpected Event Type In Message");
                }
            };

            ws.Connect();
            ActiveSockets.Add(ws);

            var keepAliveTimer = new Timer(KeepAliveHandler, new KeepAliveContext
            {
                Client    = client,
                ListenKey = listenKey
            }, KeepAliveMilliseconds, KeepAliveMilliseconds);

            return(listenKey);
        }
        static async Task Main(string[] args)
        {
            using (var webSocket = new ClientWebSocket())
            {
                await webSocket.ConnectAsync(new Uri("ws://localhost:5000/json-rpc-greeter"), CancellationToken.None);

                IJsonRpcMessageHandler jsonRpcMessageHandler = new WebSocketMessageHandler(webSocket);

                IGreeter jsonRpcGreeterClient = JsonRpc.Attach <IGreeter>(jsonRpcMessageHandler);

                HelloReply helloReply = await jsonRpcGreeterClient.SayHelloAsync(new HelloRequest { Name = "Tomasz Pęczek" });

                Console.WriteLine(helloReply.Message);

                await webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "Client closing", CancellationToken.None);
            }

            Console.ReadKey();
        }
예제 #11
0
        /// <summary>
        /// Connect to Binance User Data Streams.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="listenKey"></param>
        /// <param name="AccountUpdateMessageHandler">Callback for outboundAccountPosition receive message.</param>
        /// <param name="BalanceUpdateMessageHandler">Callback for balanceUpdate receive message.</param>
        /// <param name="OrderUpdateMessageHandler">Callback for executionReport receive message.</param>
        public void ConnectToUserDataStreams <T>(string listenKey, WebSocketMessageHandler <AccountUpdate> AccountUpdateMessageHandler, WebSocketMessageHandler <BalanceUpdate> BalanceUpdateMessageHandler, WebSocketMessageHandler <OrderUpdate> OrderUpdateMessageHandler)
        {
            var targetURI = BinanceConstants.WEBSOCKET_BASE_ENDPOINT_URL + listenKey;

            var ws = new WebSocket(targetURI);

            ws.OnMessage += (sender, e) =>
            {
                var payload = JsonConvert.DeserializeObject <dynamic>(e.Data);

                switch (payload.e.Value)
                {
                case "outboundAccountPosition":
                    var AccountUpdate = JsonConvert.DeserializeObject <AccountUpdate>(e.Data);
                    AccountUpdateMessageHandler(AccountUpdate);
                    break;

                case "balanceUpdate":
                    var BalanceUpdate = JsonConvert.DeserializeObject <BalanceUpdate>(e.Data);
                    BalanceUpdateMessageHandler(BalanceUpdate);
                    break;

                case "executionReport":
                    var OrderUpdate = JsonConvert.DeserializeObject <OrderUpdate>(e.Data);
                    OrderUpdateMessageHandler(OrderUpdate);
                    break;
                }
            };

            ws.OnError += (sender, e) =>
            {
                _socketList.Remove(ws);
            };

            ws.OnClose += (sender, e) =>
            {
                _socketList.Remove(ws);
            };

            ws.Connect();
            _socketList.Add(ws);
        }
        public async Task Invoke(HttpContext context)
        {
            if (context.WebSockets.IsWebSocketRequest)
            {
                var webSocket = await context.WebSockets.AcceptWebSocketAsync();

                IJsonRpcMessageHandler jsonRpcMessageHandler = new WebSocketMessageHandler(webSocket);

                using (var jsonRpc = new JsonRpc(jsonRpcMessageHandler, new GreeterServer()))
                {
                    jsonRpc.StartListening();

                    await jsonRpc.Completion;
                }
            }
            else
            {
                context.Response.StatusCode = StatusCodes.Status400BadRequest;
            }
        }
예제 #13
0
 public ConnectionMaintainer(String version, List <String> destinations, List <Int32> ports, X509Certificate2 cert)
 {
     this.Protocol = "message";
     _cacert       = cert;
     _servers      = new List <Uri>();
     foreach (Int32 port in ports)
     {
         foreach (String destination in destinations)
         {
             String uriString = "ws://" + destination + ":" + port + "/gwupe-ws/ws";
             try
             {
                 Uri uri = new Uri(uriString);
                 _servers.Add(uri);
             }
             catch (UriFormatException e)
             {
                 Logger.Error("Failed to parse URI " + uriString + ", skipping : " + e.Message);
             }
         }
     }
     _wsMessageHandler = new WebSocketMessageHandler(this);
 }
예제 #14
0
        //------------------------------------------------------------------------------------------------
        // construction
        //------------------------------------------------------------------------------------------------

        public DeribitJsonRpcService
        (
            IDeribitService deribit,
            IDeribitWebSocketService wsservice,
            DeribitConfig config
        )
        {
            // dependencies
            this.deribit       = deribit;
            this.deribitconfig = config;
            this.wsservice     = wsservice;
            // logger
            this.logger = Serilog.Log.ForContext <DeribitJsonRpcService>();
            // message formatter
            JsonMessageFormatter messageformatter = new JsonMessageFormatter()
            {
                Encoding        = Encoding.UTF8,
                ProtocolVersion = new Version(2, 0),
            };
            // attach json rpc to websocket
            WebSocketMessageHandler wsmh = new WebSocketMessageHandler(wsservice.ClientWebSocket);

            this.JsonRpc = new StreamJsonRpc.JsonRpc(wsmh);
            // build proxy // https://github.com/microsoft/vs-streamjsonrpc/blob/master/doc/dynamicproxy.md
            this.RpcProxy = this.JsonRpc.Attach <IDeribitJsonRpcProxy>(new JsonRpcProxyOptions
            {
                ServerRequiresNamedArguments = true,
            });
            // tracing
            if (config.EnableJsonRpcTracing)
            {
                var listener = new global::SerilogTraceListener.SerilogTraceListener();
                this.JsonRpc.TraceSource.Listeners.Add(listener);
                this.JsonRpc.TraceSource.Switch.Level = System.Diagnostics.SourceLevels.Information;
                this.logger.Verbose("JsonRpc tracing enabled");
            }
        }
예제 #15
0
        public async Task <IActionResult> Greeter()
        {
            if (!HttpContext.WebSockets.IsWebSocketRequest)
            {
                return(new BadRequestResult());
            }

            _logger.LogInformation("等待客户端连接...");
            var socket = await HttpContext.WebSockets.AcceptWebSocketAsync();

            _logger.LogInformation("已与客户端建立连接");

            var handler = new WebSocketMessageHandler(socket);

            using (var jsonRpc = new JsonRpc(handler, _greeterServer))
            {
                _logger.LogInformation("开始监听客户端消息...");
                jsonRpc.StartListening();
                await jsonRpc.Completion;
                _logger.LogInformation("客户端断开了连接");
            }

            return(new EmptyResult());
        }
 public async Task WriteMessage_BufferIsSmallerThanOneEncodedChar()
 {
     this.handler            = new WebSocketMessageHandler(this.socket, new JsonMessageFormatter(), 2);
     this.formatter.Encoding = Encoding.UTF32;
     await this.handler.WriteAsync(CreateDefaultMessage(), this.TimeoutToken);
 }
예제 #17
0
 public NotificationController(IBrokerRepository repo)
 {
     _messageHandler = new WebSocketMessageHandler(new WebSocketConnectionManager(), repo);
 }
예제 #18
0
 public WebSocketMessageHandlerTests(ITestOutputHelper logger)
     : base(logger)
 {
     this.socket  = new MockWebSocket();
     this.handler = new WebSocketMessageHandler(this.socket, BufferSize);
 }
예제 #19
0
 public async Task WriteMessage_BufferIsSmallerThanOneEncodedChar()
 {
     this.handler          = new WebSocketMessageHandler(this.socket, 2);
     this.handler.Encoding = Encoding.UTF32;
     await this.handler.WriteAsync(1, this.TimeoutToken);
 }
예제 #20
0
 public MessageApiController(IMessageService messageService, WebSocketMessageHandler chat)
 {
     _messageService = messageService;
     _chat           = chat;
 }
예제 #21
0
 public ChannelBusiness(IChannelRepository channelRepository, WebSocketMessageHandler webSocketMessageHandler)
 {
     this.channelRepository       = channelRepository;
     this.webSocketMessageHandler = webSocketMessageHandler;
 }
예제 #22
0
 public string ConnectUserDataEndpointSync(BinanceClient client,
                                           WebSocketMessageHandler <WsUserDataAccountUpdateMessage> accountUpdateHandler,
                                           WebSocketMessageHandler <WsUserDataOrderUpdateMessage> orderUpdateHandler,
                                           WebSocketMessageHandler <WsUserDataTradeUpdateMessage> tradeUpdateHandler)
 => ConnectUserDataEndpoint(client, accountUpdateHandler, orderUpdateHandler, tradeUpdateHandler).Result;
예제 #23
0
 public void ConnectTradesEndpoint(string symbol, WebSocketMessageHandler <WebSocketTradesMessage> messageHandler)
 {
     ConnectWebSocketEndpoint(GetWsEndpoint("aggTrade", symbol), messageHandler);
 }
예제 #24
0
 public void ConnectKlineEndpoint(string symbol, KlineInterval interval, WebSocketMessageHandler <WebSocketKlineMessage> messageHandler)
 {
     ConnectWebSocketEndpoint(GetWsEndpoint("kline_" + interval, symbol), messageHandler);
 }
예제 #25
0
 public void ConnectDepthEndpoint(string symbol, WebSocketMessageHandler <WebSocketDepthMessage> messageHandler)
 {
     ConnectWebSocketEndpoint(GetWsEndpoint("depth", symbol), messageHandler, CustomJsonParsers.DepthMessageParser);
 }
 public async Task WriteMessage_BufferIsSmallerThanOneEncodedChar()
 {
     this.handler          = new WebSocketMessageHandler(this.socket, 2);
     this.handler.Encoding = Encoding.UTF32;
     await Assert.ThrowsAsync <ArgumentException>(() => this.handler.WriteAsync("a", this.TimeoutToken));
 }