Java在使用端口时Socket和ServerSocket的区别

在服务器端,我们使用

Socket server = serverSocket.accept();

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

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

实际上我的问题是,在客户端,当我们创建套接字时,我们可以指定我们想要使用的本地端口 . 在我们成功在该本地端口创建客户端套接字后,我们可以将该端口重用于其他客户端套接字吗?在套接字关闭(或端口关闭)之前,该端口是否会永久绑定到套接字?由于客户端没有“Listening”概念,我们是否能够像ServerSocket那样做(参考ServerSocket可以在一个端口下创建多个套接字)?

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

请指出正确的方向,我知道我的想法有些不对劲 . 非常感谢 .

回答(3)

3 years ago

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

你的术语令人困惑 . ServerSocket.accept() 接受连接,并将 endpoints 包装在 Socket 中 . endpoints 具有与 ServerSocket 相同的本地端口号,根据RFC 793定义,因此包装 Socket 也是如此 .

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

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

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

没有 .

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

是的,或者反过来说:套接字绑定到端口 .

由于客户端没有“Listening”概念,我们是否可以像ServerSocket那样做(参考ServerSocket可以在一个端口下创建多个socket)?

没有 .

3 years ago

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

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

3 years ago

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

  • {Self Port,Self Addr}

  • {Dest Port,Dest Addr}

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

希望这可以帮助 .