当有两个以上的线程在运行时,如何使两个线程只相互响应-Java
我正在做一个项目,我需要创建一个java服务器和一些客户端,这样客户端就可以在服务器上玩tic-tac-toe。客户端和服务器将在同一个网络中,所以IP不会有任何问题,它们总是一样的。现在,对于这个问题,只有两个玩家一起玩一场比赛,但是会有多场比赛在运行,所以服务器应该处理这个问题。我遇到的问题是,我正在使用服务器上的线程在客户机之间交换移动,我不知道如何使一个线程只与另一个线程通信,而不通知或与其他线程交互它当前没有遇到的问题。 有没有办法将两个线程与其他线程隔离? 我不能上传任何代码,因为我甚至不知道从哪里开始当有两个以上的线程在运行时,如何使两个线程只相互响应-Java,java,multithreading,sockets,Java,Multithreading,Sockets,我正在做一个项目,我需要创建一个java服务器和一些客户端,这样客户端就可以在服务器上玩tic-tac-toe。客户端和服务器将在同一个网络中,所以IP不会有任何问题,它们总是一样的。现在,对于这个问题,只有两个玩家一起玩一场比赛,但是会有多场比赛在运行,所以服务器应该处理这个问题。我遇到的问题是,我正在使用服务器上的线程在客户机之间交换移动,我不知道如何使一个线程只与另一个线程通信,而不通知或与其他线程交互它当前没有遇到的问题。 有没有办法将两个线程与其他线程隔离? 我不能上传任何代码,因为我
谢谢。此问题与聊天应用程序类似。尝试查看任何基于xmpp的应用程序服务器(openfire)由于您在专用网络中,并且使用套接字,因此您可以使用每个客户端的地址进行标识。此外,您可以将一个对象分配给两个客户端作为同步对象,以便可以进行线程间通信。如果您的整个游戏都在一个套接字上进行,则不会出现问题。当服务器套接字接受时,创建一个线程,并让该线程处理套接字。没有其他线程在作用域中具有该套接字 如果您希望每个游戏移动都发生在一个单独的套接字连接上,而使用寿命较长的线程保持游戏状态,那么这就更复杂了
可能最简单的解决方案是每个服务器线程都有自己的服务器套接字,使用动态分配的端口。服务器将有一个众所周知的端口,在该端口上协商新会话:
client server
connect (well known port) -------> accept (well known port)
request new game -------> create new server socket (dynamic port)
launch thread to listen on dynamic port
receive dynamic port num <------- respond with dynamic port num
connect (dynamic port) -------> (in thread) accept, handle game
play game on this socket -------> ...
当您收到游戏活动请求时:
// also in the dispatcher
String sessionId = request.getSessionId(); // HTTP header, something from payload, whatever
queue.add(request);
// In the thread
while(game.isActive()) {
Request request = queue.take();
handle(request);
}
虽然我已经展示了一个使用JDK中的队列类的简单实现,但队列实现(如各种JMS实现(例如ActiveMQ)、Kafka、Redis)为您提供了更强大的抽象。例如,所有这些都允许您定义单个队列,但消费者只能获取与标头(例如会话id)匹配的消息
在所有这些示例中,如果安全性是一个问题,那么您需要防范会话密钥窃取。两个线程在您使用的公共锁上相互通信。如果两个线程需要相互通信,则在它们之间使用公共锁
// also in the dispatcher
String sessionId = request.getSessionId(); // HTTP header, something from payload, whatever
queue.add(request);
// In the thread
while(game.isActive()) {
Request request = queue.take();
handle(request);
}