因此,我正在从事套接字编程项目,在该项目中,客户端首先连接到身份验证服务器,一旦登录成功,客户端就将连接到游戏服务器。
我现在创建了一个基本代码,并对用户名/密码进行了硬编码,但是稍后将使用数据库。
我面临的问题是登录成功后我不知道如何将客户端从身份验证服务器转移到游戏服务器
这是我的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();
}
}
}
}
答案 0 :(得分:0)
假设身份验证和游戏服务器部署在一个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扩展了线程{ 专用套接字套接字;
public GameServerThread(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
// do your really want to do
}
}
此方法具有以下缺点:
一个套接字需要一个线程来处理,而当有两个客户端时,服务器的线程可能会用完。为了克服这个问题,您可以使用Java NIO API
进行相同的工作。