单线程Java上的两个客户端

单线程Java上的两个客户端,java,multithreading,sockets,network-programming,serversocket,Java,Multithreading,Sockets,Network Programming,Serversocket,我正在编写一个程序,在这个程序中,我有一个服务器,它不断地侦听请求(与大多数服务器一样)。我希望它在每次获得客户机连接时创建一个新线程(我完成了这部分),并希望它在连接后立即将客户机添加到同一线程。因此,我将有两个客户端连接到同一个线程 大致如下: ..... try(ServerSocket serversocket = new ServerSocket(); Socket client1 = serversocket.accept(); Socket client2 = se

我正在编写一个程序,在这个程序中,我有一个服务器,它不断地侦听请求(与大多数服务器一样)。我希望它在每次获得客户机连接时创建一个新线程(我完成了这部分),并希望它在连接后立即将客户机添加到同一线程。因此,我将有两个客户端连接到同一个线程

大致如下:

.....
try(ServerSocket serversocket = new ServerSocket();
    Socket client1 = serversocket.accept();
    Socket client2 = serversocket.accept();){

    //spawn new thread with sockets to client1 and client2
这可能吗?有没有别的办法?有可能让两个不同的线程彼此对话吗

是否可以从扩展到客户端的线程创建新的服务器套接字

...
try(ServerSocket serversocket = new ServerSocket();
    Socket client1 = serversocket.accept();){
    //spawn thread
}
现在在线程中:

....
try(ServerSocket serversocket2 = new ServerSocket();
    Socket client2 = serversocket2.accept();){
    //exchange information between two clients and do other stuff
}

有什么想法吗?非常感谢您提供的所有帮助。

制作一个
ArrayList
怎么样,您可以制作一个
ClientThread
类或其他什么,它的构造函数接受一个
Socket
参数。然后,当你获得一个新的连接时,做一些类似的事情

Socket clientSocket = serverSocket.accept();
arrayList.add(new ClientThread(clientSocket));

我们为不同的客户机使用不同线程的主要原因是,可以单独处理客户机,而不会阻塞可能需要不同内容的其他客户机。如果你想在以后扩展你的程序,比如说,为客户提供不同的难度,你需要不同的设置

当客户端连接时,会启动一个新线程,并在服务器上的标志表中设置一个标志,表示“客户端可用”(可能包含有关客户端的更多信息;例如难度级别)。然后服务器告诉客户机正在等待合适的对手,然后返回等待。当一个合适的对手连接时,相应的标志包含对两个客户端的引用,现在您有两个线程和合适的客户端

假设游戏是基于回合而非实时的,游戏可以按如下方式进行:开始时,每个客户端向服务器请求与服务器提供的另一个客户端对应的套接字,并在上面的标志表中查找引用。然后,客户机通过套接字通信来决定他们之间的游戏、选项等。一旦两个客户都知道空板是什么样子,他们就开始玩;他们在黑板上互相发送更改,如“骑士到d5”。他们自己完成,或者在服务器上保存记录


在代码中,每当处理试图通信的独立线程时,都需要使用同步方法和线程安全对象。你可以在上进一步阅读。

我想到的问题是,为什么?我正在尝试制作许多不同的双人棋盘游戏的虚拟版本。如果你有任何其他方法可以做到这一点,请随意放弃回答。连接1建立某种组/标识符,连接2要求加入相同的“组”(如果存在)。两个连接都驻留在各自的线程中…?但是如何创建组?!我带来了几乎相同的东西,但我不知道如何让两个线程相互通信。这取决于你。您可以使用
映射
,或其他某种查找机制,其中组管理两个连接之间传递的信息,这不是我想要的。在我的服务器类中有这样的线程,每次收到连接时我都会生成一个新线程。在这个新创建的线程中,我想创建一个新的套接字,只向该套接字添加一个客户端。您试图做的似乎是在同一个套接字中添加无限多个客户端,并让它们等待轮到它们。这不是我想做的。那么你是想让两个客户端线程相互通信吗?是的,是的。这正是我想要做的。因此,您需要实际创建线程部分的帮助,而不是通信部分,对吗?您不在代码中确定这一点吗?等等,假设您有客户机1、2和3。所以你不知道客户端1是应该与2对话,还是2应该与3对话,等等?但是在这种情况下,我只能在每台服务器上进行一个游戏。如果我想要尽可能多的比赛怎么办?那么,我如何知道哪个thread1(连接的第一个客户端)与哪个thread2(连接的第二个客户端)对话?@Fazer进行了相应的编辑。您究竟将什么定义为引用?它们在客户端对之间有什么区别?就像@I1zZY所说的,您可以简单地将线程添加到保存线程的ArrayList中。或者您可以给它们命名,并按名称引用它们。当我尝试将线程添加到arraylist时,会显示以下错误消息:“此处不允许使用“void”类型”。