5

在服务器端,我们使用

Socket server = serverSocket.accept();

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

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

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

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

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

4

3 回答 3

4

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

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

于 2013-07-18T17:50:28.000 回答
4

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

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

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

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

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

不。

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

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

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

不。

于 2013-07-18T21:51:02.043 回答
1

您应该将套接字想象为两对信息数组:

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

因此,单个服务器可能有许多连接到它的连接,它们的 {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

希望这可以帮助。

于 2016-01-01T09:42:24.160 回答