java - 如何使服务器将客户端重定向到另一台服务器?
问题描述
所以我正在研究套接字编程项目,其中客户端首先连接到身份验证服务器,一旦登录成功,客户端就会连接到游戏服务器。
我现在创建了一个基本代码并硬编码了用户名/密码,但稍后将使用数据库。
我面临的问题是,一旦登录成功,我不知道如何将客户端从身份验证服务器转移到游戏服务器
这是我的 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();
}
}
}
}
解决方案
假设身份验证和游戏服务器部署在一个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 扩展 Thread { 私有 Socket 套接字;
public GameServerThread(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
// do your really want to do
}
}
这种方法有以下缺点:一个socket需要一个线程处理,当有两个多个客户端时,服务器的线程可能会耗尽。为了克服这一点,你可以用Java NIO API
做同样的工作。
推荐阅读
- django - 是否可以删除 URL 路径:Django
- python - 抓取表格内容时,Python web-scraping 没有返回任何内容/null
- tf-idf - 为什么 tfidf 对象占用这么多空间?
- c# - 在 asp.net 中支持 Authorize.Net webhook
- sql-server - 在 SQL Server 2014 和 Management Studio 中重命名服务器名称?
- mysql - 一对多关系,排序和过滤孩子
- c# - 我怎样才能做到这一点,当我按下按钮时,它会打开另一个表单以在 c# 中登录
- sql - 按查询选择不存在于分组中的表列
- python - 为 Python 3.7 安装 auto-py-to-exe 模块在 Windows 上返回错误
- html - 如何将 HTML 文件输入作为 blob 类型存储到 SQL 数据库中