public static ServerBridge createServerConnection(
      int port, SeedValidator validator, Class... registeredClasses) {

    if (AbstractServer.getInstance() == null) {
      try {
        throw new Exception("Cannot create a server connection if AbstractServer is null.");
      } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      }
    }

    ServerBridge bridge = ServerBridge.create(validator);

    Server server = new Server(16384, 8192);
    NetworkManager networkManager =
        new NetworkManager(ConnectionType.SERVER, ServerBridge.getInstance());
    server.addListener(new NetworkListener(validator, networkManager));
    try {
      ServerConnectionProvider provider = new ServerConnectionProvider(server, registeredClasses);
      provider.connect(); // server.start()
      server.bind(port);
    } catch (IOException e) {
      // TODO Auto-generated catch block
      System.out.println("Error : Could not connect / create the server.");
      e.printStackTrace();
    }

    AbstractServer.getInstance().setBridge(bridge);
    return bridge;
  }
  public void testRMI() throws IOException {
    Server server = new Server();
    register(server.getKryo());
    startEndPoint(server);
    server.bind(tcpPort);

    final ObjectSpace serverObjectSpace = new ObjectSpace();
    final TestObjectImpl serverTestObject = new TestObjectImpl(4321);
    serverObjectSpace.register((short) 42, serverTestObject);

    server.addListener(
        new Listener() {
          public void connected(final Connection connection) {
            serverObjectSpace.addConnection(connection);
            runTest(connection, 12, 1234);
          }

          public void received(Connection connection, Object object) {
            if (!(object instanceof MessageWithTestObject)) return;
            MessageWithTestObject m = (MessageWithTestObject) object;
            System.out.println(serverTestObject.value);
            System.out.println(((TestObjectImpl) m.testObject).value);
            assertEquals(4321f, m.testObject.other());
            stopEndPoints(2000);
          }
        });

    // ----

    Client client = new Client();
    register(client.getKryo());

    ObjectSpace clientObjectSpace = new ObjectSpace(client);
    final TestObjectImpl clientTestObject = new TestObjectImpl(1234);
    clientObjectSpace.register((short) 12, clientTestObject);

    startEndPoint(client);
    client.addListener(
        new Listener() {
          public void connected(final Connection connection) {
            RmiTest.runTest(connection, 42, 4321);
          }

          public void received(Connection connection, Object object) {
            if (!(object instanceof MessageWithTestObject)) return;
            MessageWithTestObject m = (MessageWithTestObject) object;
            System.out.println(clientTestObject.value);
            System.out.println(((TestObjectImpl) m.testObject).value);
            assertEquals(1234f, m.testObject.other());
            stopEndPoints(2000);
          }
        });
    client.connect(5000, host, tcpPort);

    waitForThreads();
  }
  public GameServer() throws IOException {
    server = new Server() {};

    server.addListener(
        new Listener() {
          @Override
          public void received(Connection connection, Object object) {
            LOG.log(
                Level.INFO,
                "New connection to server ={0}, recieved ={1}",
                new Object[] {connection, object});
            // We know all connections for this server are actually ChatConnections.
            if (object instanceof Request) {
              Request request = (Request) object;
              System.out.println("Get from client: " + request);
              Request response = player.getRequest(request.getGameField());
              System.out.println("Send to client: " + response);
              connection.sendTCP(response);
            }
          }
        });
  }