【问题标题】:Is new socket created for every request?是否为每个请求创建了新的套接字?
【发布时间】:2014-01-23 05:18:12
【问题描述】:

我正试图围绕网络套接字。到目前为止,我的理解是服务器创建了一个绑定到特定端口的新套接字。然后它监听这个套接字来处理客户端请求。

我读过这个教程http://docs.oracle.com/javase/tutorial/networking/sockets/definition.html,上面写着

如果一切顺利,服务器接受连接。接受后, 服务器获得一个绑定到同一个本地端口的新套接字,并且还具有 其远程端点设置为客户端的地址和端口。它需要 一个新的套接字,以便它可以继续监听原始套接字 连接请求,同时满足连接客户端的需求。

这里有一些我不太明白的地方

如果一切顺利,服务器接受连接。

  1. 是否意味着客户端请求成功到达监听套接字?

接受后,服务器会获得一个绑定到同一个本地端口的新套接字,并且 还将其远程端点设置为客户端的地址和端口

  1. 新套接字已创建。它也被绑定到同一个端口,但它不监听传入的请求。服务器处理客户端请求后,将响应写入此套接字,然后将其关闭。这是正确的吗?

  2. 这是否意味着请求以某种方式从第一个套接字传递到第二个套接字?

它需要一个新的套接字,以便它可以继续收听原来的 用于连接请求的套接字,同时满足连接客户端的需求。

  1. 因此,创建了新的套接字,然后侦听传入请求。有不同类型的插座吗?某种“监听”套接字和其他?

  2. 为什么服务器必须创建一个新的监听套接字?为什么不能重用之前的?

【问题讨论】:

    标签: sockets tcp network-programming


    【解决方案1】:
    1. 没有。这意味着传入的连接到达了服​​务器。
    2. 没有。如果服务器关闭它,它就会关闭。不然。
    3. 没有。这意味着传入的连接会导致连接完全形成,并在服务器上创建一个套接字来表示它的服务器端端点。
    4. (a) 否。创建一个新套接字以接收 请求和发送响应。 (b) 是的。有无源和有源插座。被动套接字侦听连接。活动套接字发送和接收数据。
    5. 不必创建新的侦听(被动)套接字。它必须创建一个新的活动套接字作为新连接的端点。

    是否为每个请求创建新的套接字?

    大多数协议,例如带有 keep-alive 的 HTTP,允许每个连接有多个请求。

    【讨论】:

    • 关于1,“[服务器接受连接]是否意味着客户端请求成功到达监听socket?”accept()的结果一个工作的监听套接字。
    • @CodeCaster 否。accept() 的结果是一个工作的 active 套接字。监听套接字是被动套接字:参见 4(b)。像 OP 一样,您误用了“聆听”一词。
    【解决方案2】:

    1) 传入连接已到达 2)套接字没有关闭 3)有服务器套接字,只有套接字。服务器socket.accept在客户端连接时返回一个socket对象

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-26
      • 1970-01-01
      • 2011-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多