Как заставить сервер перенаправить клиента на другой сервер? - PullRequest
0 голосов
/ 01 февраля 2019

Итак, я работаю над проектом программирования сокетов, где клиент сначала подключается к серверу аутентификации, а после успешного входа клиент подключается к игровому серверу.

Я создал основной код и жестко закодировалимя пользователя / пароль на данный момент, но позже я буду использовать базу данных.

Проблема, с которой я сталкиваюсь, заключается в том, что я не знаю, как перенести клиента с сервера аутентификации на игровой сервер после успешного входа в систему

вот мой thead loginServer, который обрабатывает часть входа.

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

1 Ответ

0 голосов
/ 01 февраля 2019

Предположим, что аутентификация и игровой сервер развернуты в одной jvm. При успешном входе в систему не закрывайте сокет, а перенесите сокет на 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;
    }
}

открытый класс GameServerThread extendsThread {private Socket socket;

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

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

}

Этот метод имеет следующий недостаток: для одного сокета требуется один поток для обработки, при наличии двух или нескольких клиентов поток сервера может закончиться.Чтобы преодолеть это, вы можете использовать Java NIO API для выполнения той же работы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...