gpt4 book ai didi

java - 在 Socket 中处理多个客户端

转载 作者:行者123 更新时间:2023-12-02 00:25:57 27 4
gpt4 key购买 nike

我开发了一个 java swing 客户端-服务器应用程序。服务器有许多服务,如数据库服务、缓存服务和与客户端对话的客户端服务。

客户端服务在端口上打开套接字并监听传入连接。它为每个客户端连接生成一个新线程,创建一个 session 并读取传入的序列化对象。它维持此 session (使线程保持 Activity 状态),直到客户端发出“CLOSE_SESSION”命令。

我想知道的是为每个新的客户端套接字 session 生成一个新线程是否正确。谢谢。

我的客户服务代码如下。

创建服务器套接字的代码:

            try {
ServerSocket socket = new ServerSocket(serverPort);
Socket listener = socket.accept();

Thread client = new Thread(new ClientHandler(listener));
client.start();

} catch (IOException ex) {
log.error(new Throwable(ex));
}

为每个客户端生成新线程的代码

class ClientHandler implements Runnable {

private static Logger log = Logger.getLogger(ClientHandler.class);

private Socket listener;

public ClientHandler(Socket listener) {
this.listener = listener;
}

public void run() {
try {
ObjectInputStream inStream = new ObjectInputStream(
listener.getInputStream());
try {
ServiceRequestResponse request = (ServiceRequestResponse) inStream
.readObject();
if (request != null && request.getServiceCommand() != null) {

ServiceCommand command = request.getServiceCommand();
log.debug("command : " + command.getCommand());
log.debug("is session alive? " + request.isAlive());
log.debug("ServiceCommand.CREATE_SESSION : "
+ ServiceCommand.CREATE_SESSION.getCommand());
if (!request.isAlive()
&& command.getCommand().equals(
ServiceCommand.CREATE_SESSION.getCommand())) {
// No session yet, and service command issued is login.
// Call login service, check credentials and create
// session.
request.setSessionId(UUID.randomUUID());
log.debug("Created user session with id : "
+ request.getSessionId());
} else {
if (command.getCommand().equals(
ServiceCommand.CLOSE_SESSION)) {
// Close session and do clean up here
}
// Here session is alive.
while (!ServiceCommand.CLOSE_SESSION.equals(command
.getCommand())) {
// Read the service command from the request
// response and
// Hand it over to the appropriate handler.
}

}

}

} catch (ClassNotFoundException ex) {
log.error(new Throwable(ex));
}

} catch (IOException ex) {

}

}

}

最佳答案

如果您的客户端 session 请求可以持续很长时间,那么每个连接线程是一个很好的解决方案。

替代方案是:

  • 使用 NIO;
  • 如果客户端请求较短,则使用线程池。

关于java - 在 Socket 中处理多个客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10052160/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com