【问题标题】:Java the difference of Socket and ServerSocket in using portJava Socket 和 ServerSocket 使用端口的区别
【发布时间】:2013-07-17 19:30:07
【问题描述】:

在服务器端,我们使用

Socket server = serverSocket.accept();

创建一个套接字。套接字创建后,我们可以创建一个新线程来处理该套接字的输入/输出流。因此,如果有进一步的连接请求进来,我们可以回到同一个端口监听并创建新的套接字。由于我们已经在特定端口创建了 ServerSocket,当然我们不能在该端口再次创建另一个 ServerSocket。

所以根据我的理解,我可以得出结论,在服务器端,我们可以在一个端口下创建多个套接字吗? (类似于网络服务器所做的)

其实我的问题是,在客户端,当我们创建一个套接字时,我们可以指定我们想要使用的本地端口。在我们在该本地端口成功创建客户端套接字后,我们可以将该端口重用于其他客户端套接字吗?该端口是否永久绑定到套接字,直到套接字关闭(或端口关闭)?既然客户端没有“监听”的概念,我们能不能和ServerSocket一样做(参考ServerSocket可以在一个端口下创建多个socket)?

我很困惑客户端如何处理端口和套接字,因为我正在将 ServerSocket 与客户端套接字进行比较。

请指出正确的方向,我知道我的想法在某种程度上是错误的。非常感谢。

【问题讨论】:

    标签: java sockets tcp port serversocket


    【解决方案1】:

    所以根据我的理解,我是否可以得出结论,在服务器端,我们可以在一个端口下创建多个套接字? (类似于网络服务器所做的)

    您对自己的术语感到困惑。 ServerSocket.accept() 接受 连接, 并将端点包装在Socket 中。根据RFC 793 的定义,端点与ServerSocket 具有相同的本地端口号,因此包装Socket 也是如此。

    其实我的问题是,在客户端,当我们创建一个套接字时,我们可以指定我们想要使用的本地端口。

    我们可以,但我们很少这样做。

    在本地端口成功创建客户端套接字后,我们可以将该端口重用于其他客户端套接字吗?

    没有。

    在套接字关闭(或端口关闭)之前,该端口是否永久绑定到套接字?

    是的,或者相反:套接字绑定到端口。

    既然客户端没有“监听”的概念,我们能不能和ServerSocket一样做(参考ServerSocket可以在一个端口下创建多个socket)?

    没有。

    【讨论】:

    • 嗨,我想我差不多明白了。我只是意识到要形成一个有效的套接字,我们需要唯一的 (local_address, local_port, remote_address, remote_port) 对。假设我在端口 400 创建了一个客户端套接字,并连接到 IP 123。在此连接终止之前,我在同一端口创建另一个客户端套接字,即 400,并将其连接到 IP 456。将创建第二个客户端套接字被接受?
    • 对于 TCP/IP,没有。您一次只能让一个应用程序监听一个端口。现在,如果您有 2 个网卡,您可以让一个应用程序使用相同的端口号侦听第一个 IP 和第二个 IP 上的第二个应用程序。一个有效的示例可以有两个客户端在 ip 123.0.0.1 同时通过端口 4000 和 4001 连接到端口 80 上的服务器 ip 123.0.0.2。两者都连接到服务器上的 80,但是客户端端口的不同区分了联系。对于 UDP(多播),多个应用程序可以订阅同一个端口,但那是另一回事
    • 你不能在 [i.e.绑定到]同一个端口'。理论上,如果要连接到不同的目标,RFC 允许它,但实际上 bind() 在 connect() 之前,因此内核不会允许它。
    【解决方案2】:

    ServerSocket 可以简单地视为传入连接的Socket 工厂。对于每个传入的客户端连接,ServerSocket.accept() 方法会返回一个新的 Socket 以与该客户端进行通信,并且只与该客户端进行通信。

    换句话说,可以对单个ServerSocket 进行任意数量的连接(仅受操作系统限制),并且每个客户端连接将获得一个单独的Socket 进行通信,所有通信都使用同一服务器端进行通信TCP 端口。

    【讨论】:

    • 嗨,我想我差不多明白了。我只是意识到要形成一个有效的套接字,我们需要唯一的 (local_address, local_port, remote_address, remote_port) 对。假设我在端口 400 创建了一个客户端套接字,并连接到 IP 123。在此连接终止之前,我在同一端口创建另一个客户端套接字,即 400,并将其连接到 IP 456。将创建第二个客户端套接字被接受?
    【解决方案3】:

    你应该把一个套接字想象成一个两对信息数组:

    • {自端口,自地址}
    • {目标端口,目标地址}

    因此,单个服务器可能有许多连接到它,它们的 {Dest Port, Dest Addr} 不同

    example: Server port 10000 addr 10.0.0.1
    
    Socket 1:
    
     - {10000,10.0.0.1}
     - {10001,10.0.0.2}
    
    Socket 2:
    
     - {10000,10.0.0.1}
     - {10002,10.0.0.1} - address may seem the same but as a whole its a
       different destination
    

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2011-12-28
      • 2017-04-10
      • 2019-09-24
      • 2015-05-03
      • 2014-08-04
      • 1970-01-01
      • 1970-01-01
      • 2014-12-21
      • 1970-01-01
      相关资源
      最近更新 更多