【问题标题】:How Socket Handles more than one simultaneous client requests?Socket 如何同时处理多个客户端请求?
【发布时间】:2013-11-17 10:37:27
【问题描述】:

我对 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 就能正确处理它们? (假设这三个请求的传播延迟可能存在差异,即使它们同时发送)。

请帮忙。谢谢。

【问题讨论】:

  • 您需要为每个请求创建一个线程。示例:stackoverflow.com/questions/5109654/…>

标签: java sockets tcp


【解决方案1】:

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

while(shouldAcceptConnections){

Socket client = ss.accept();

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

}

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

【讨论】:

  • 如果传输协议为我完成了维护正确缓冲顺序的工作,因此如果我将侦听套接字置于循环中,它将仅以正确的顺序处理请求。即使同时有请求,我也不必在意。正确的?请纠正我。
  • 是的,客户请求将按顺序进行
【解决方案2】:

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

如果三个客户端同时发送请求

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

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

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

如果我使用单个incomingLink 套接字

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

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

是的,见上文。

以便我的单个incomingLink Socket 能够正确处理它们?

我不知道这是什么意思。

【讨论】:

  • 我的意思是单个incomingLink 套接字incomingLink = ss.accept(); 对象是否足以处理所有这些请求?
  • 但是现在正如您所说,传输协议将为我完成维护正确缓冲顺序的工作,因此如果我将侦听套接字置于循环中,它将仅以正确的顺序处理请求。对吗?
  • 鉴于我已经说过,这个问题要么是多余的,要么没有意义。
  • 嗯,我喜欢您在上面给出的解决方案和建议。我只是想从你那里得到更多的知识,但你说“问题没有意义”。我想人们可能会问任何问题,Stackoverflow 说像你这样的人应该正确引导他们。嗯谢谢你的回答。我应该遵循它。
  • 我不知道你不明白什么。我在上面告诉过你,没有“单个incomingLink 套接字”:每个accept() 都有一个新的套接字。你似乎要我重复一遍。
猜你喜欢
  • 2012-04-20
  • 2014-05-23
  • 2016-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多