计划创建一个带有登录的服务器线程(接受新客户端并创建将处理它们的线程)和注销方法。 login方法将被socket.accept()方法阻塞,以等待客户端。如果服务器线程被其他方法阻止,那么想要注销的其他客户端是否能够在服务器线程上调用logout方法?
答案 0 :(得分:1)
没有。如果一个线程被阻塞,它进行任何额外处理的唯一方法就是唤醒并继续执行。
也就是说,其他客户端线程可以调用一个logout方法来操作来自自己线程的共享数据结构。您可能希望为此考虑并发方法,或者在服务器线程上使用NIO和非阻塞IO。
答案 1 :(得分:1)
线程是一个执行流程。你在这里有多个。连接接受线程在accept()
中被阻止。如果我理解正确,“客户端”线程已经启动并正在处理与已连接客户端的对话。我猜测“在服务器线程上调用logout方法”你的意思是“在类上调用logout()
方法,它也有login()
方法”。由于“客户端”线程会这样做,所以应该没问题,除非login()
和logout()
没有为某个地方的同一个锁而战。
答案 2 :(得分:0)
我认为你应该在一个只创建一个ThreadHandler的线程中使用accept并将此连接添加到它,ThreadHandle是另一个将登录用户然后做你想要的更多的线程。
我为聊天服务器提供了这样的代码:
while(true)
{
Socket clientSocket = server.accept();
ClientThreadHandler c = new ClientThreadHandler(clientSocket);
server.addClientThread(c);
}
处理程序现在会尝试验证客户端。
实现心跳也很好,服务器会将数据包发送到连接且经过身份验证的客户端,检查客户端是否仍然运行。如果没有,服务器将关闭连接。 ThreadHandler将始终监听客户请求并对其进行处理。 不要忘记同步从不同线程访问的方法。