单线程Java上的两个客户端

时间:2015-05-27 02:30:23

标签: java multithreading sockets network-programming serversocket

我正在编写一个程序,其中我有一个持续监听请求的服务器(如大多数服务器)。我想让它在每次获得客户端连接时创建一个新线程(我已完成此部分),并且我希望它在它之后立即将客户端添加到同一个线程。所以我将有两个客户端连接到同一个线程。

有些事情:

.....
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
}

有什么想法吗?非常感谢所有帮助。

2 个答案:

答案 0 :(得分:2)

你如何制作一个ArrayList,你可以创建一个ClientThread类或者其他东西,它的构造函数需要Socket个参数。然后,当您获得新连接时,请执行类似

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

答案 1 :(得分:1)

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

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

假设游戏是基于回合的而不是实时游戏,游戏可以按如下方式播放:在开始时,每个客户端向服务器请求与服务器提供的其他客户端对应的套接字,查找上面的标志表中的引用。然后,客户通过套接字进行通信来决定它们之间的游戏,选项等。一旦两个客户都知道空板看起来像什么,他们就开始玩了;他们在棋盘上互相发送更改,比如'骑士到d5'。他们自己处理完成,或者可能在服务器上保留记录。

在代码中,每当处理尝试通信的单独线程时,您都需要使用 synchronized方法线程安全对象。您可以在the Java Tutorials page了解更多信息。