예제 #1
0
        public override void onStart()
        {
            base.onStart();

            if (serverInformation == null)
            {
                // we need to run a server
                var localServerPort = DEFAULT_GAME_PORT;
                server = new GameServer(new NetworkConnectionProvider(RemoteGameProtocol.instance,
                                                                      new Target(Target.AnyIP, localServerPort), GameServer.MAX_CONNECTIONS));
                server.initializeSimulation();
                // run the server on a server thread
                serverThread = new Thread(server.Start);
                serverThread.Start();
                serverInformation = new ServerInformation {
                    ip = Target.LoopbackIP, port = localServerPort
                };
            }

            // run a client and connect
            // TODO: locally generate and store RSA client key
            client = new RemoteGameClient(new NetworkClientConnection(RemoteGameProtocol.instance));
            var clientConnectTask = client.ConnectAsync(new Target(serverInformation.ip, serverInformation.port));

            clientConnectTask.ContinueWith(x => client.sendMessageAsync(new JoinMessage {
                ready = true
            }));
//            client.onGameInfo = setupOnConnected;
            client.subscribe <GameInfoMessage>(setupOnConnected);
            client.subscribe <EmpireFetchMessage>(empireFetch);
            client.subscribe <WorldUpdateMessage>(worldUpdate);

            gameState = new RemoteGameState();
        }
예제 #2
0
    public void ReliableReceiveCallback(byte[] buffer, int size)
    {
        // this will be called when the endpoint extracts messages from received packets
        // buffer is byte[] and size is number of bytes in the buffer.
        // do not keep a reference to buffer as it will be pooled after this function returns
        NetworkMessage.MessageType mType = NetworkMessage.ParseMessage(buffer, size);
        Log("Messge! " + mType);
        if (mType == NetworkMessage.MessageType.FindGame)
        {
            if (ServerMain.clientWaitingToMatch == null)
            {
                ServerMain.clientWaitingToMatch = this;
            }
            else
            {
                ServerMain.clientWaitingToMatch.remoteOpponent = this;
                remoteOpponent = ServerMain.clientWaitingToMatch;

                byte[] playerOneSeed = new byte[4];
                byte[] playerTwoSeed = new byte[4];
                random.NextBytes(playerOneSeed);
                random.NextBytes(playerTwoSeed);

                byte[] playerOneData = new byte[10];
                byte[] playerTwoData = new byte[10];

                BitConverter.GetBytes(
                    (UInt16)NetworkMessage.MessageType.PlayerSeeds
                    ).CopyTo(playerOneData, 0);

                playerOneData.CopyTo(playerTwoData, 0);

                playerOneSeed.CopyTo(playerOneData, 2);
                playerOneSeed.CopyTo(playerTwoData, 6);

                playerTwoSeed.CopyTo(playerOneData, 6);
                playerTwoSeed.CopyTo(playerTwoData, 2);

                reliableEndpoint.SendMessage(playerOneData, playerOneData.Length, QosType.Reliable);
                ServerMain.clientWaitingToMatch.Send(playerTwoData, playerTwoData.Length, QosType.Reliable);
                ServerMain.clientWaitingToMatch = null;
            }
        }
        else
        {
            Log("Forwarding! " + mType);
            if (remoteOpponent == null && remoteClient != null && server != null)
            {
                server.Disconnect(remoteClient);
            }
            else
            {
                if (remoteOpponent != null)
                {
                    remoteOpponent.Send(BitConverter.GetBytes((UInt16)mType), 2, QosType.Reliable);
                }
            }
        }
    }
예제 #3
0
    private void clientDisconnectedHandler(RemoteClient client)
    {
        Log("clientDisconnectedHandler");
        if (
            clientWaitingToMatch != null &&
            clientWaitingToMatch.remoteClient != null &&
            clientWaitingToMatch.remoteClient.ClientID == client.ClientID
            )
        {
            clientWaitingToMatch = null;
        }
        if (clientList.ContainsKey(client.ClientID) && clientList[client.ClientID].remoteOpponent != null)
        {
            server.Disconnect(clientList[client.ClientID].remoteOpponent.remoteClient);
        }

        clientList.Remove(client.ClientID);
    }