示例#1
0
 public void Dispose()
 {
     _httpClient.Dispose();
     _password.Dispose();
     _mazeServer?.Dispose();
     _mazeServer = null;
 }
示例#2
0
 public ServerCommandListener(MazeSocketConnector connector, WebSocketWrapper mazeSocket, MazeServer mazeServer,
                              ILifetimeScope container)
 {
     _connector  = connector;
     _mazeSocket = mazeSocket;
     _mazeServer = mazeServer;
     _container  = container;
 }
        public async Task InvokeAsync(HttpContext context)
        {
            if (!context.WebSockets.IsWebSocketRequest)
            {
                await _next(context);

                return;
            }

            if (!context.User.Identity.IsAuthenticated)
            {
                context.Response.StatusCode = (int)HttpStatusCode.Unauthorized;
                return;
            }

            var socket = await context.WebSockets.AcceptWebSocketAsync();

            var wrapper = new WebSocketWrapper(socket, _options.PackageBufferSize);
            var server  = new MazeServer(wrapper, _options.PackageBufferSize, _options.MaxHeaderSize, ArrayPool <byte> .Shared);

            if (context.User.IsAdministrator())
            {
                var accountId  = context.User.GetAccountId();
                var connection = new AdministrationConnection(accountId, wrapper, server);

                _connectionManager.AdministrationConnections.TryAdd(accountId, connection);
                try
                {
                    await connection.BeginListen();
                }
                finally
                {
                    _connectionManager.AdministrationConnections.TryRemove(accountId, out _);
                }
            }
            else
            {
                var clientId   = context.User.GetClientId();
                var connection = new ClientConnection(clientId, wrapper, server);
                _connectionManager.ClientConnections.TryAdd(clientId, connection);

                _serviceProvider.Execute <IClientConnectedAction, IClientConnection>(connection).Forget();

                try
                {
                    await connection.BeginListen();
                }
                finally
                {
                    _connectionManager.ClientConnections.TryRemove(clientId, out _);
                }

                await _serviceProvider.Execute <IClientDisconnectedAction, int>(connection.ClientId);
            }
        }
示例#4
0
        public MazeChannelRedirect(int channelId, MazeServer server1, MazeServer server2)
        {
            _channelId = channelId;
            _server1   = server1;
            _server2   = server2;
            server1.AddChannel(this, channelId);

            _channel = new Channel
            {
                DataReceived = DataReceived,
                Disposed     = Server2ChannelDisposed
            };
            server2.AddChannel(_channel, channelId);
        }
示例#5
0
        public async Task ExecuteTest()
        {
            var dataStream    = new MemoryStream();
            var requestSocket = new MazeSocket(dataStream, keepAliveInterval: null);
            var requestServer = new MazeServer(requestSocket, PackageSize, MaxHeaderSize, ArrayPool <byte> .Shared);

            var request     = GetRequest();
            var requestTask = requestServer.SendRequest(request, CancellationToken.None); //will wait for a response
            await Task.Delay(20);

            dataStream.Position = 0;

            var receiverSocket = new MazeSocket(dataStream, null);
            var receiverServer = new MazeServer(receiverSocket, PackageSize, MaxHeaderSize, ArrayPool <byte> .Shared);

            var completionSource = new TaskCompletionSource <MazeRequestReceivedEventArgs>();

            receiverServer.RequestReceived += (sender, args) => completionSource.SetResult(args);

            try
            {
                await receiverSocket.ReceiveAsync();
            }
            catch (WebSocketException) //EOF
            {
            }

            var result = await completionSource.Task;

            await AssertReceivedRequest(request, result.Request);

            dataStream.SetLength(0);

            await WriteResponse(result.Response);

            await receiverServer.FinishResponse(result);

            dataStream.Seek(0, SeekOrigin.Begin);
            try
            {
                await requestSocket.ReceiveAsync();
            }
            catch (WebSocketException) //EOF
            {
            }

            var response = await requestTask;

            await AssertReceivedResponse(result.Response, response);
        }
示例#6
0
        public void CreateGameTest()
        {
            MazeServer server = new MazeServer(new GameService.GameServiceFirst(), new LoginService.LoginServiceFirst(), port); // Create server

            server.Start();

            MazeClient client = new MazeClient();

            client.Connect(ip, port);

            var temp   = client.Login("Alleshka", "Alleshka13372");
            var gameID = client.CreateGame(temp);

            server.Stop();
        }
示例#7
0
 private void OnCloseChannel(int channelId)
 {
     if (_mazeServer != null)
     {
         try
         {
             _mazeServer?.CloseChannel(channelId);
         }
         catch (Exception)
         {
             _mazeServer.Dispose();
             _mazeServer = null;
         }
     }
 }
示例#8
0
        public void TestGame()
        {
            MazeServer server = new MazeServer(new GameService.GameServiceFirst(), new LoginService.LoginServiceFirst(), port); // Create server

            server.Start();


            MazeClient client = new MazeClient();

            client.Connect(ip, port);

            var user1 = client.Login("Alleshka", "Alleshka13372");
            var user2 = client.Login("Alleshka", "Alleshka13372");

            var gameID = client.CreateGame(user1);
            var temp   = client.JoinGame(gameID, user2);
        }
示例#9
0
        protected async Task <MazeServer> GetServerConnection()
        {
            if (_mazeServer != null)
            {
                return(_mazeServer);
            }

            await _mazeServerLock.WaitAsync();

            try
            {
                if (_mazeServer != null)
                {
                    return(_mazeServer);
                }

                var builder = new UriBuilder(_httpClient.BaseAddress)
                {
                    Path = "ws", Scheme = _httpClient.BaseAddress.Scheme == "https" ? "wss" : "ws"
                };

                var connector = new MazeSocketConnector(builder.Uri)
                {
                    AuthenticationHeaderValue = _httpClient.DefaultRequestHeaders.Authorization
                };
                var dataStream = await connector.ConnectAsync();

                var webSocket = WebSocket.CreateClientWebSocket(dataStream, null, 8192, 8192, TimeSpan.FromMinutes(2), true,
                                                                WebSocket.CreateClientBuffer(8192, 8192));

                var webSocketWrapper = new WebSocketWrapper(webSocket, 8192);
                _mazeServer = new MazeServer(webSocketWrapper, 8192, 4096, ArrayPool <byte> .Shared);

                webSocketWrapper.ReceiveAsync().ContinueWith(ReceiveAsyncContinuation).Forget();
                return(_mazeServer);
            }
            finally
            {
                _mazeServerLock.Release();
            }
        }
示例#10
0
        public void LoginTest()
        {
            MazeServer server = new MazeServer(1337);

            server.Start();

            Socket client = new Socket(SocketType.Stream, ProtocolType.Tcp);

            client.Connect("127.0.0.1", 1337);

            LoginRequest loginRequest = new LoginRequest("Alleshka", "123qwe");

            client.Send(LoginRequest.ToBytes(loginRequest));

            byte[] bytes = new byte[1024];
            client.Receive(bytes);
            LoginResponse loginResponse = LoginResponse.ToObject(bytes) as LoginResponse;

            Assert.AreEqual(typeof(Guid), loginResponse.UserID.GetType());
            server.Stop();
        }
示例#11
0
        public async Task InitializeWebSocket(ILifetimeScope lifetimeScope)
        {
            var builder = new UriBuilder(RestClient.BaseUri)
            {
                Path   = "ws",
                Scheme = RestClient.BaseUri.Scheme == "https" ? "wss" : "ws"
            };

            var connector = new MazeSocketConnector(builder.Uri)
            {
                AuthenticationHeaderValue = new AuthenticationHeaderValue("Bearer", RestClient.Jwt)
            };
            var dataStream = await connector.ConnectAsync();

            var webSocket = WebSocket.CreateClientWebSocket(dataStream, null, _options.PackageBufferSize, _options.PackageBufferSize,
                                                            _options.KeepAliveInterval, true, WebSocket.CreateClientBuffer(_options.PackageBufferSize, _options.PackageBufferSize));

            var wrapper = new WebSocketWrapper(webSocket, _options.PackageBufferSize);
            var server  = new MazeServer(wrapper, _options.PackageBufferSize, _options.MaxHeaderSize, ArrayPool <byte> .Shared);

            Listener = new ServerCommandListener(connector, wrapper, server, lifetimeScope);
            await Listener.Listen();
        }
示例#12
0
        public void LoginTest2()
        {
            MazeServer server = new MazeServer(1337);

            server.Start();

            Socket client1 = new Socket(SocketType.Stream, ProtocolType.Tcp);

            client1.Connect("127.0.0.1", 1337);
            LoginRequest loginRequest1 = new LoginRequest("Alleshka", "123qwe");

            client1.Send(LoginRequest.ToBytes(loginRequest1));
            byte[] bytes1 = new byte[1024];
            client1.Receive(bytes1);
            LoginResponse login1 = LoginResponse.ToObject(bytes1) as LoginResponse;

            Socket client2 = new Socket(SocketType.Stream, ProtocolType.Tcp);

            client2.Connect("127.0.0.1", 1337);
            LoginRequest loginRequest2 = new LoginRequest("Alleshka", "123qwe");

            client2.Send(LoginRequest.ToBytes(loginRequest2));
            byte[] bytes2 = new byte[1024];
            client2.Receive(bytes2);
            LoginResponse login2 = LoginResponse.ToObject(bytes2) as LoginResponse;

            UserCountRequest userCountRequest = new UserCountRequest(login1.UserID);

            client1.Send(UserCountRequest.ToBytes(userCountRequest));
            bytes1 = new byte[1024];
            client1.Receive(bytes1);
            UserCountResponse countResponse = UserCountResponse.ToObject(bytes1) as UserCountResponse;

            Assert.AreEqual(2, countResponse.UserCount);
            server.Stop();
        }
示例#13
0
 private void ReceiveAsyncContinuation(Task obj)
 {
     _mazeServer?.Dispose();
     _mazeServer = null;
 }
示例#14
0
 public AdministrationConnection(int accountId, WebSocketWrapper webSocket, MazeServer mazeServer)
 {
     AccountId  = accountId;
     WebSocket  = webSocket;
     MazeServer = mazeServer;
 }
示例#15
0
 public void Dispose()
 {
     WebSocket?.Dispose();
     MazeServer?.Dispose();
 }
示例#16
0
 public ClientConnection(int clientId, WebSocketWrapper webSocket, MazeServer mazeServer)
 {
     ClientId         = clientId;
     WebSocketWrapper = webSocket;
     MazeServer       = mazeServer;
 }