Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当有两个以上的线程在运行时,如何使两个线程只相互响应-Java_Java_Multithreading_Sockets - Fatal编程技术网

当有两个以上的线程在运行时,如何使两个线程只相互响应-Java

当有两个以上的线程在运行时,如何使两个线程只相互响应-Java,java,multithreading,sockets,Java,Multithreading,Sockets,我正在做一个项目,我需要创建一个java服务器和一些客户端,这样客户端就可以在服务器上玩tic-tac-toe。客户端和服务器将在同一个网络中,所以IP不会有任何问题,它们总是一样的。现在,对于这个问题,只有两个玩家一起玩一场比赛,但是会有多场比赛在运行,所以服务器应该处理这个问题。我遇到的问题是,我正在使用服务器上的线程在客户机之间交换移动,我不知道如何使一个线程只与另一个线程通信,而不通知或与其他线程交互它当前没有遇到的问题。 有没有办法将两个线程与其他线程隔离? 我不能上传任何代码,因为我

我正在做一个项目,我需要创建一个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);
  }