1

我对 Socket 编程有非常基本的怀疑(也与网络有关)。我有 ServerSocket 之类的东西..

 ServerSocket ss = new ServerSocket(1234);

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

 Socket incomingLink = ss.accept();

并请注意,有超过 1 个客户端(比如 3 个客户端)有他们的出站链接套接字,例如..

 Socket outgoingLink = new Socket(ServerIp, 1234);

好吧,要求是服务器有一些本地参数(比如)

 String state;
 int timeStamp;

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

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

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

或者,如果我使用单个incomingLink 套接字,底层传输协议(TCP/UDP)是否会为我处理这些同时请求,将它们缓冲到缓冲区,并保持正确的顺序,然后将它们一个接一个地提供给我ServerSocket,以便我的单个incomingLink Socket 可以正确处理它们?(假设这三个请求的传播延迟可能存在差异,即使这些请求是同时发送的)。

请帮忙。谢谢。

4

2 回答 2

2

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

while(shouldAcceptConnections){

Socket client = ss.accept();

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

}

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

于 2013-11-06T09:18:24.503 回答
0

这是一个非常奇怪的要求。你确定你理解正确吗?

如果所有三个客户端在完全相同的时间发送他们的请求

网络中没有“完全相同的时间”这样的东西。(a) 它是不可发现的,并且 (b) 网络是一个顺序介质。因此连接请求将按顺序到达,而不是同时到达。具体来说,accept()将一次返回一个Socket,无论您的本地 TCP 堆栈决定的顺序是合适的。

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

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

如果我使用单个incomingLink 套接字

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

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

是的,见上文。

这样我的单个incomingLink Socket 就能正确处理它们?

我不知道这是什么意思。

于 2013-11-06T09:16:33.450 回答