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