在服务器端,我们使用
Socket server = serverSocket.accept();
创建一个套接字 . 创建套接字后,我们可以创建一个新线程来处理该套接字的输入/输出流 . 因此,如果有进一步的连接请求,我们可以回到同一端口监听并创建新套接字 . 由于我们已经在特定端口创建了ServerSocket,当然我们无法再在该端口创建另一个ServerSocket .
所以根据我的理解,我可以得出结论,在服务器端,我们可以在一个端口下创建多个套接字吗? (类似于Web服务器的功能)
实际上我的问题是,在客户端,当我们创建套接字时,我们可以指定我们想要使用的本地端口 . 在我们成功在该本地端口创建客户端套接字后,我们可以将该端口重用于其他客户端套接字吗?在套接字关闭(或端口关闭)之前,该端口是否会永久绑定到套接字?由于客户端没有“Listening”概念,我们是否能够像ServerSocket那样做(参考ServerSocket可以在一个端口下创建多个套接字)?
我很困惑客户端如何处理端口和套接字,因为我正在比较ServerSocket和客户端套接字 .
请指出正确的方向,我知道我的想法有些不对劲 . 非常感谢 .
3 回答
您应该将套接字想象为两对信息数组:
{Self Port,Self Addr}
{Dest Port,Dest Addr}
因此,单个服务器可能有许多连接到它的{Dest Port,Dest Addr}
希望这可以帮助 .
你的术语令人困惑 .
ServerSocket.accept()
接受连接,并将 endpoints 包装在Socket
中 . endpoints 具有与ServerSocket
相同的本地端口号,根据RFC 793定义,因此包装Socket
也是如此 .我们可以,但我们很少这样做 .
没有 .
是的,或者反过来说:套接字绑定到端口 .
没有 .
ServerSocket
可以简单地视为传入连接的Socket
工厂 . 对于每个传入的客户端连接,ServerSocket.accept()
方法返回一个新的Socket
以与之通信,并且仅与该客户端进行通信 .换句话说,可以对单个
ServerSocket
进行任意数量的连接(仅受OS限制),并且每个客户端连接将获得单独的Socket
进行通信,所有连接都使用相同的服务器端TCP端口进行通信 .