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();
        }
Esempio n. 3
0
        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);
                    }
                }
            }
        }