如何使服务器将客户端重定向到另一台服务器?

How to make a server redirect a client to another server?

所以我正在进行套接字编程项目,客户端首先连接到身份验证服务器,一旦登录成功,客户端就会连接到游戏服务器。

我创建了一个基本代码并对 username/password 进行了硬编码,但稍后会使用数据库。

我遇到的问题是登录成功后不知道如何将客户端从认证服务器转移到游戏服务器

这是我处理登录部分的 loginServer thead。

public class LoginServerThread extends Thread {
private Socket socket;

public LoginServerThread(Socket socket){
    this.socket = socket;
}
@Override
public void run(){
    try{
        BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        System.out.println("Client Connected");

        PrintWriter output = new PrintWriter(socket.getOutputStream(),true);
        String echoString;

        boolean unlock = false;

        while (!unlock){
            output.println("USERNAME: ");
            echoString = input.readLine();
            if(echoString.equals("exit")){
                break;
            } else if (echoString.equals("username")){

                for(int i = 0; i < 3;){
                    output.println("PASSWORD: ");
                    echoString = input.readLine();{

                        if(echoString.equals("password")){
                            output.println("Login Successful");
                            unlock = true;
                            break;

                        }else{
                            i++;
                        }
                    }
                }
            }
        }


    }catch (IOException e){
        e.printStackTrace();
    }finally {
        try {
            socket.close();
        }catch(IOException e){
            e.printStackTrace();
        }
     }
   }
}

假设认证和游戏服务器部署在一个jvm.When登录成功不关闭socket,而是将socket转移到GameServerThread: LoginServer 仅检查身份验证:

public class LoginServer {
    private static final Logger log = LoggerFactory.getLogger(LoginServer.class);

    public static void main(String[] args) throws Exception {
        ServerSocket loginServer = new ServerSocket();
        SocketAddress serverSocketAddress = new InetSocketAddress("localhost", 5230);
        loginServer.bind(serverSocketAddress);
        for (; ; ) {
            Socket socket = loginServer.accept();
            if (loginCHeck(socket)) {
                // transfer to game server thread to process
                log.info("socket check begin create thread to process");
                new GameServerThread(socket).run();
            } else {
                // authentication failed process
            }
        }
    }

    public static boolean loginCHeck(Socket socket) {
        // check authentication 
        return true;
    }
}

public class GameServerThread 扩展线程 { 私有套接字套接字;

public GameServerThread(Socket socket) {
    this.socket = socket;
}

@Override
public void run() {
    // do your really want to do
}

}

该方法存在以下不足: 一个套接字需要一个线程来处理,当有两个多客户端时,服务器的线程可能运行 out。为了克服这个问题,您可以使用 Java NIO API 来做同样的工作。