Socket如何处理多个并发客户端请求?

时间:2013-11-06 09:10:57

标签: java sockets tcp

我对Socket编程有很基本的疑问(也与网络有关)。 我有类似的服务器..

 ServerSocket ss = new ServerSocket(1234);

我有一个名为incomingLink的Socket来处理传入的请求..

 Socket incomingLink = ss.accept();

请注意,有超过1个客户端(比如说3个客户端)有他们的outgoingLink Socket类似的东西..

 Socket outgoingLink = new Socket(ServerIp, 1234);

嗯,要求是服务器有一些本地参数(比方说)

 String state;
 int timeStamp;

应在第一次客户请求到达时更新。随后的请求将被丢弃。这意味着如果首先收到客户端1的请求,那么客户端2和3的请求将被丢弃。

现在我的问题是,如果所有三个客户端都在同一时间发送请求,那么我的ServerSocket将如何处理这些请求? 我是否需要创建一个socket数组来独立处理这三个请求?

 Socket[] incomingLink = new Socket[3];
 incomingLink[0] = ss.accept();
 incomingLink[1] = ss.accept();
 incomingLink[2] = ss.accept(); 

否则,如果我使用单个incomingLink套接字,底层传输协议(TCP / UDP)是否可以帮我处理这些同步请求,方法是将它们缓冲到缓冲区,并保持正确的顺序,然后再提供一个另一个到我的ServerSocket,以便我的单个incomingLink Socket将正确处理它们? (假设即使这些请求同时发送,这三个请求的传播延迟也会有变化)。

请帮忙。感谢。

2 个答案:

答案 0 :(得分:2)

通常你创建在循环中监听的客户端套接字,如下所示:

while(shouldAcceptConnections){

Socket client = ss.accept();

// usually here you would fire a thread to handle your client

}

换句话说,如果ss.accept()不在循环中而只是一次然后终止只有第一个客户端将设法连接(其他将被拒绝 - 被动拒绝,因为不会接受。)。您当然也可以在循环中执行此操作并主动拒绝它们。

答案 1 :(得分:0)

这是 非常 奇怪的要求。你确定你已经正确理解了吗?

  

如果所有三个客户都在同一时间发送他们的请求

在网络中没有“完全相同的时间”。 (a)这是不可发现的,(b)网络是连续的中介。因此,连接请求将按顺序到达,而不是同时到达。具体而言,accept()将一次返回一个Socket,无论您的本地TCP堆栈决定的顺序是什么。

  

我是否需要创建一个socket数组来独立处理这三个请求

我不明白为什么。您只需创建Socket变量来存储每个accept()的结果,并在单独的线程中处理每个Socket

  

如果我使用单个incomingLink套接字

你做不到。这个建议没有意义。每个接受的Socket都是一个单独的对象。

  

底层传输协议(TCP / UDP)是否可以帮我处理这些同步请求,方法是将它们缓冲到缓冲区,并保持正确的顺序,然后将它们一个接一个地提供给我的ServerSocket

是的,见上文。

  

这样我的单个incomingLink Socket会正确处理它们吗?

我不知道这意味着什么。