Example #1
0
        public void MapHub <THub>(string path, Format format) where THub : Hub
        {
            _app.UseRouter(rb => {
                rb.MapRoute($"{path}", (RequestDelegate)(async context => {
                    //var identity = (ClaimsIdentity)context.User.Identity;
                    //var email = identity.IsAuthenticated ? identity.Claims.First(c => c.Type == ClaimTypes.Email).Value : "no email";
                    if (context.WebSockets.IsWebSocketRequest)
                    {
                        var webSocket = await context.WebSockets.AcceptWebSocketAsync();
                        var connectionId =
                            context.Request.Query.ContainsKey("connectionId")
                            ? (string)context.Request.Query["connectionId"]
                            : Guid.NewGuid().ToString();
                        var channel = new WsChannel(webSocket, format);

                        var connection = new Connection {
                            User = context.User,
                            Channel = channel,
                            ConnectionId = connectionId
                        };
                        connection.Metadata.Format = format;
                        // TODO check existing connection by ID, User must match on reconnect

                        // now pass this connection to a method that starts processing
                        var endpoint = context.RequestServices.GetRequiredService <HubEndPoint <THub> >();
                        var processingTask = endpoint.OnConnectedAsync(connection);

                        await Task.WhenAll(processingTask, connection.Channel.Completion);

                        return;
                    }
                    context.Response.StatusCode = StatusCodes.Status403Forbidden;
                }));
            });
        }
Example #2
0
        public static void Main(string[] args)
        {
            Console.WriteLine("Websocket Client");

            Console.WriteLine("Enter URI of websocket server to connect to");

            while (_WsChannel == null)
            {
                var  input    = Console.ReadLine();
                bool validURI = Uri.TryCreate(input, UriKind.Absolute, out Uri uri);
                if (validURI == false)
                {
                    Console.WriteLine("Uri you entered isn't valid");
                    continue;
                }

                var task = Task.Run(async() => await TryConnect(2000, uri));
                task.Wait();
                KeyValuePair <bool, WebSocket> connected = task.Result;

                if (connected.Key == false)
                {
                    Console.WriteLine("Connection failed");
                    continue;
                }

                Console.WriteLine("Connected");
                _WsChannel = new WsChannel(connected.Value, Format.Text);
            }

            Task.Run(async() =>
            {
                while (true)
                {
                    var stream = await _WsChannel.ReadAsync();
                    RecyclableMemoryStream rs = stream as RecyclableMemoryStream;
                    if (stream == null)
                    {
                        break;
                    }
                    byte[] buffer = new byte[rs.Length];
                    rs.Position   = 0;
                    rs.Read(buffer, 0, (int)rs.Length);
                    var message = Encoding.UTF8.GetString(buffer);
                    Console.WriteLine($"Arrived Message: {message}");
                }
            });

            Console.WriteLine("Enter Messages to send to server. Enter q to Quit");
            while (true)
            {
                string input = Console.ReadLine();
                if (input == "q")
                {
                    break;
                }

                var          data   = Encoding.UTF8.GetBytes(input);
                MemoryStream stream = RecyclableMemoryStreamManager.Default.GetStream("userInput", data.Length, true);
                stream.Write(data, 0, data.Length);
                var writeTask = Task.Run(async() => await _WsChannel.WriteAsync(stream));
                writeTask.Wait();
                stream.Dispose();
            }
        }