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(); }
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); } } } }
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); }