当前位置: 首页 > 面试题库 >

ServerSocket是否在任意端口上接受返回套接字?

韩博厚
2023-03-14
问题内容

关于Java中的serversockets,我已经看到了许多与此答案相似的答案:“假设您有一台服务器,其serversocket的端口为5000。客户端A和客户端B将连接到我们的服务器。

客户端A在端口5000上向服务器发送请求。客户端A侧的端口由操作系统选择。通常,操作系统会选择下一个可用的端口。该搜索的起点是先前使用的端口号+
1(例如,如果操作系统最近碰到了我们的端口45546,则操作系统将尝试45547)。

假定没有连接问题,服务器将收到客户端A在端口5000上进行连接的请求。然后服务器打开自己的下一个可用端口,并将其发送给客户端。在这里,客户端A连接到新端口,并且服务器现在又具有可用的端口5000。”

我已经在stackoverflow的多个问题中看到过类似的答案,这些问题涉及如何在accept()的返回套接字中使用与ServerSocket正在侦听的端口不同的端口。我一直给人的印象是TCP是由四重信息标识的:

客户端IP:客户端端口和服务器IP:服务器端口->协议(以区分TCP和UDP)

那么为什么accept()需要返回绑定到另一个端口的套接字?在不需要使用服务器计算机上不同端口进行通信的情况下,在每个报头中发送的信息四方组是否足以将与同一服务器端口的多个连接与不同计算机区分开?


问题答案:

您在TCP数据包头信息中是正确的。它包含了:

Client IP | Client Port | Server IP | Server Port | Protocol

或者,更恰当的选择(因为考虑到双向传输时客户端/服务器会造成混乱):

Source IP | Source Port | Destination IP | Destination Port | Protocol

到同一服务器端口的多个连接将来自客户端上的 不同端口 。一个示例可能是:

0.0.0.0:45000 -> 1.1.1.1:80
0.0.0.0:45001 -> 1.1.1.1:80

客户端端口的差异足以消除两个套接字的歧义,因此具有两个单独的连接。服务器无需打开另一个端口上的另一个套接字。它确实从该accept方法接收套接字,但已将其分配给相同的端口,并且现在是返回到新接受的客户端的路由。

另一方面,FTP确实具有一种模型,其中服务器将打开一个新的非特权端口(>
1023),并将其发送回客户端以供客户端连接(这称为“被动FTP”)。这是为了解决客户端位于防火墙后面且无法接受来自服务器的传入数据连接的问题。但是,在典型的HTTP服务器(或任何其他标准套接字实现)中不是这种情况。该功能位于FTP之上。



 类似资料:
  • 客户端IP:客户端端口和服务器IP:服务器端口->协议(以区分TCP和UDP) 那么为什么accept()需要返回绑定到不同端口的套接字呢?每个报头中发送的四组信息是否足以区分来自不同机器的到同一服务器端口的多个连接,从而不需要使用服务器机器上的不同端口进行通信?

  • 我对Socket和ServerSocket端口用法感到困惑。Oracle关于套接字的Java教程是这样说的: 插座是什么? 通常,服务器运行在特定的计算机上,并具有绑定到特定端口号的套接字。服务器只是等待,监听套接字让客户机发出连接请求。在客户端:客户端知道服务器运行的机器的主机名和服务器侦听的端口号。要发出连接请求,客户端尝试在服务器的机器和端口上与服务器会合。客户端还需要向服务器标识自己,以便

  • 以下是我的问题: 请纠正我在上面的理解--我通过指定一个端口来打开一个套接字(),比方说8001,现在我的服务器将开始侦听这个端口上的请求,现在它从一个客户端得到一个请求,类似于,所以一旦它接受连接,它将创建一个本地端口,比方说10001,所以现在这个客户端请求将通过10001接受(或者换句话说,与客户端的连接将通过端口10001建立),而8001将再次空闲并侦听新的请求? 那么,这是否意味着使用

  • 我写了自己的类加载器,它与类一起工作,实现了接口插件。但是我不能将类转换为插件。怎么了? 错误:(18,47)java:不兼容的类型:java。lang.类无法转换为插件 我补充说,这是我的SimpleClassLoader类的主要部分,它扩展了ClassLoader。

  • 我最近开始尝试使用JavaSockets类在服务器和客户机之间创建双向连接。当我使用客户机套接字地址作为但是当我在 客户端套接字显示连接是通过测试返回true。 然而,在服务器端,代码似乎并没有向前推进 我应该提供代码还是问题明确? 编辑:更多信息。无论我的防火墙处于什么状态,使用外部ip地址从我自己的电脑上远程登录都是有效的。当防火墙打开时,java客户端代码不起作用,抛出 当防火墙关闭时,使用

  • 我有一个作为接入点(也称为wifi热点)运行的android设备,它运行的代码是: 我将有一些其他客户端设备连接到此设备的wifi热点,并尝试连接到插座,但它将无法。 接入点的 IP 地址类似于 192.168.43.1 ...所以我将尝试从客户端设备连接到192.168.43.1:8080,它将不起作用。 但是,如果两个设备都连接到另一个wifi网络,则服务器套接字。接受();它会工作得很好!我