public void CreateMatch(Guid creatorClientId, Room room, Guid[] clientIds, Player[] players, ReplayData replay, ServerEventHandler callback) { if (m_protocol != null) { throw new InvalidOperationException(); } LowProtocol <ClientSocket> protocol = new LowProtocol <ClientSocket>(m_url + "create", m_time.Time); m_protocol = protocol; m_protocol.Enabled += OnEnabled; m_protocol.SocketError += OnError; m_protocol.Disabled += OnDisabled; m_response = externalError => { callback(externalError); }; m_call = () => { RemoteCall rpc = new RemoteCall(RemoteCall.Proc.CreateMatch, ServerContainer.ServerIdentity, RemoteArg.Create(creatorClientId), RemoteArg.Create(room), RemoteArg.Create(clientIds), RemoteArg.Create(players), RemoteArg.Create(replay)); Call(rpc, (error, remoteResult) => { m_response = externalError => { if (externalError != null) { callback(externalError); } else { callback(error); } }; m_protocol.Disable(); }); }; m_protocol.Enable(); }
public void IsAlive(ServerEventHandler callback) { if (m_protocol != null) { throw new InvalidOperationException(); } LowProtocol <ClientSocket> protocol = new LowProtocol <ClientSocket>(m_url, m_time.Time); m_protocol = protocol; m_protocol.Enabled += OnEnabled; m_protocol.SocketError += OnError; m_protocol.Disabled += OnDisabled; m_response = externalError => { callback(externalError); }; m_call = () => { RemoteCall rpc = new RemoteCall(RemoteCall.Proc.IsAliveCheck, ServerContainer.ServerIdentity); Call(rpc, (error, remoteResult) => { m_response = externalError => { if (externalError != null) { callback(externalError); } else { callback(error); } }; m_protocol.Disable(); }); }; m_protocol.Enable(); }
public async AsyncTask WebSocketRequestHandlerImpl(AspNetWebSocketContext webSocketContext) { m_protocol = new LowProtocol <WebSocketHandler>(this); RegisterConnection(m_protocol); const int maxMessageSize = 1024 * 10; //Buffer for received bits. ArraySegment <byte> receiveDataBuffer = new ArraySegment <byte>(new byte[maxMessageSize]); CancellationToken cancellationToken = CancellationToken.None; //Checks WebSocket state. while (m_webSocket.State == WebSocketState.Open) { //This operation will not block.The returned T: System.Threading.Tasks.Task`1 object will complete after the data has been received on the T:System.Net.WebSockets.WebSocket. //Exactly one send and one receive is supported on each T: System.Net.WebSockets.WebSocket object in parallel. //Reads data. WebSocketReceiveResult result = await m_webSocket.ReceiveAsync(receiveDataBuffer, cancellationToken); //If input frame is cancelation frame, send close command. if (result.MessageType == WebSocketMessageType.Close) { if (m_webSocket.State == WebSocketState.CloseReceived) { await CloseAsync(); } } else if (result.MessageType == WebSocketMessageType.Binary) { if (Message == null) { continue; } if (result.EndOfMessage) { if (m_memoryStream.Length == 0) { byte[] data = new byte[result.Count]; Array.Copy(receiveDataBuffer.Array, receiveDataBuffer.Offset, data, 0, result.Count); Message(this, data); } else { m_memoryStream.Write(receiveDataBuffer.Array, receiveDataBuffer.Offset, result.Count); byte[] data = m_memoryStream.ToArray(); m_memoryStream.SetLength(0); Message(this, data); } } else { m_memoryStream.Write(receiveDataBuffer.Array, receiveDataBuffer.Offset, result.Count); } } } }