一个线程上的两个客户端 Java
Two clients on a single thread Java
我正在编写一个程序,其中我有一个持续侦听请求的服务器(与大多数服务器一样)。我希望它在每次获得客户端连接时创建一个新线程(我已完成这部分),并且我希望它在它之后立即将客户端添加到同一个线程。所以我会让两个客户端连接到同一个线程。
大致如下:
.....
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
class 什么的,它的构造函数接受一个 Socket
参数。然后,当您获得新连接时,执行类似
的操作
Socket clientSocket = serverSocket.accept();
arrayList.add(new ClientThread(clientSocket));
我们为不同的客户端使用不同的线程的主要原因是这样可以单独处理客户端,而不会阻塞可能需要不同东西的其他客户端。如果你想在之后扩展你的程序,比如说,为客户提供不同的难度级别,你将需要不同的设置。
当客户端连接时,启动一个新线程并在服务器上的标志 table 中设置一个标志,表示 "Client available"(可能包含有关客户端的更多信息;例如难度等级)。然后服务器告诉客户端正在等待 suitable 对手,然后返回等待。当 suitable 对手确实连接时,相应的标志包含对两个客户端的 references,现在你有两个线程与 suitable 客户端。
假设游戏是回合制的,不是实时的,游戏可以这样玩:一开始,每个客户端向服务器请求另一个客户端对应的套接字,服务器给它,在上面的标志 table 中查找引用。然后,客户端通过套接字通信来决定它们之间的游戏、选项等。一旦两个客户都知道空棋盘是什么样子,他们就开始玩;他们在看板上互相发送更改,例如'knight to d5'。他们自己处理完成,或者可能在服务器上保留记录。
在代码中,每当处理尝试通信的独立线程时,您都需要使用同步方法和线程安全对象。您可以在 the Java Tutorials page.
进一步了解它
我正在编写一个程序,其中我有一个持续侦听请求的服务器(与大多数服务器一样)。我希望它在每次获得客户端连接时创建一个新线程(我已完成这部分),并且我希望它在它之后立即将客户端添加到同一个线程。所以我会让两个客户端连接到同一个线程。
大致如下:
.....
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
class 什么的,它的构造函数接受一个 Socket
参数。然后,当您获得新连接时,执行类似
Socket clientSocket = serverSocket.accept();
arrayList.add(new ClientThread(clientSocket));
我们为不同的客户端使用不同的线程的主要原因是这样可以单独处理客户端,而不会阻塞可能需要不同东西的其他客户端。如果你想在之后扩展你的程序,比如说,为客户提供不同的难度级别,你将需要不同的设置。
当客户端连接时,启动一个新线程并在服务器上的标志 table 中设置一个标志,表示 "Client available"(可能包含有关客户端的更多信息;例如难度等级)。然后服务器告诉客户端正在等待 suitable 对手,然后返回等待。当 suitable 对手确实连接时,相应的标志包含对两个客户端的 references,现在你有两个线程与 suitable 客户端。
假设游戏是回合制的,不是实时的,游戏可以这样玩:一开始,每个客户端向服务器请求另一个客户端对应的套接字,服务器给它,在上面的标志 table 中查找引用。然后,客户端通过套接字通信来决定它们之间的游戏、选项等。一旦两个客户都知道空棋盘是什么样子,他们就开始玩;他们在看板上互相发送更改,例如'knight to d5'。他们自己处理完成,或者可能在服务器上保留记录。
在代码中,每当处理尝试通信的独立线程时,您都需要使用同步方法和线程安全对象。您可以在 the Java Tutorials page.
进一步了解它