public void Dispose() { _httpClient.Dispose(); _password.Dispose(); _mazeServer?.Dispose(); _mazeServer = null; }
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); } }
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); }
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); }
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(); }
private void OnCloseChannel(int channelId) { if (_mazeServer != null) { try { _mazeServer?.CloseChannel(channelId); } catch (Exception) { _mazeServer.Dispose(); _mazeServer = null; } } }
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); }
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(); } }
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(); }
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(); }
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(); }
private void ReceiveAsyncContinuation(Task obj) { _mazeServer?.Dispose(); _mazeServer = null; }
public AdministrationConnection(int accountId, WebSocketWrapper webSocket, MazeServer mazeServer) { AccountId = accountId; WebSocket = webSocket; MazeServer = mazeServer; }
public void Dispose() { WebSocket?.Dispose(); MazeServer?.Dispose(); }
public ClientConnection(int clientId, WebSocketWrapper webSocket, MazeServer mazeServer) { ClientId = clientId; WebSocketWrapper = webSocket; MazeServer = mazeServer; }