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

时间:2013-07-18 17:37:56

标签: java sockets tcp port serversocket

在服务器端,我们使用

Socket server = serverSocket.accept();

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

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

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

我很担心客户端如何处理端口和套接字,因为我将ServerSocket与客户端套接字进行比较。

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

3 个答案:

答案 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)

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

  • {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

希望这会有所帮助。