Java ServerSocket accept()方法

Java ServerSocket accept()方法,java,Java,当我使用ServerSocket类的accept方法时,谁知道端口是如何选择的?是否可以为方法可以选择的端口定义一个范围?我可以一个接一个地“拿走”港口吗 ServerSocket sSocket = new ServerSocket(5050); Socket socket = sSocket.accept(); 将端口定义为构造函数的一部分。 如果未指定端口,则套接字未绑定(即无法访问) 要获取连接套接字的端口,请使用getPort()而不是getLocalPort()。第二个将为您提供服

当我使用ServerSocket类的accept方法时,谁知道端口是如何选择的?是否可以为方法可以选择的端口定义一个范围?我可以一个接一个地“拿走”港口吗

ServerSocket sSocket = new ServerSocket(5050);
Socket socket = sSocket.accept();
将端口定义为构造函数的一部分。 如果未指定端口,则套接字未绑定(即无法访问)


要获取连接套接字的端口,请使用getPort()而不是getLocalPort()。第二个将为您提供服务器上的端口。

您可以将
0
作为端口号传递,以便在任意空闲端口上创建服务器套接字,或者使用如下方法为给定范围内的任意空闲端口创建服务器套接字:

public java.net.ServerSocket createServerSocket(int rangeStart, int rangeEnd)
                            throws java.io.IOException {
  for(int port=rangeStart; port<=randeEnd; port++) {  
    try {
      return new ServerSocket(port);
    } catch(java.net.BindException be) {
      // debug/warning here
      continue;
    }
  }
  throw new java.io.IOException("Failed to create a server socket, all ports between " +
                                rangeStart + " - " + rangeEnd + " are already in use.");
}
public java.net.ServerSocket createServerSocket(int-rangeStart,int-rangeEnd)
抛出java.io.IOException{

对于(int port=rangeStart;port),TCP连接由四部分组成:

  • 客户端IP
  • 客户端端口
  • 服务器IP
  • 服务器端口
例如,可以有多个客户端连接到同一个服务器端口-只要这些客户端没有相同的IP相同的prt,就可以了。对于这一部分,操作系统会处理

因此,只在一个端口上监听是完全可以的。

该图不正确(并且在O'Reilly网站的中列出)

客户端随机选择其端口(您不需要在Java中执行任何特殊操作),并在指定的端口上连接到服务器。使用
netstat
commandline工具可以看到这一点

首先,仅侦听没有客户端的服务器套接字:

simon@lucifer:~$ netstat -n -a Active Internet connections (including servers) Proto Recv-Q Send-Q Local Address Foreign Address (state) ... tcp46 0 0 *.5050 *.* LISTEN ... simon@lucifer:~$netstat-n-a 活动Internet连接(包括服务器) Proto Recv-Q Send-Q本地地址外部地址(州) ... tcp46 0 0*.5050*.LISTEN ... (还有很多其他条目,我刚刚删除了不相关的条目)

现在有一个客户端从localhost(127.0.0.1)连接:

simon@lucifer:~$netstat-n-a 活动Internet连接(包括服务器) Proto Recv-Q Send-Q本地地址外部地址(州) ...
tcp4 0 0 127.0.0.1.64895 127.0.0.1.5050已建立您在说new ServerSocket(5050)时选择了端口。所有关于为接受的套接字使用不同端口的内容都是100%BS。

我在问题中添加了一个注释。请看第二行。谢谢。我不太确定您的意思。连接到服务器的100个套接字都将通过端口5050连接。如果您指的是连接到您的机器的端口,请使用getPort()。试试getLocalPort,看看这是不是真的。你正在读的是一本好书吗?“普通的旧套接字”对我来说听起来很奇怪。是的,这是一本面向初学者的书。我认为这个图像至少令人困惑,如果不是完全错误的话。它曾经是这样工作的吗?有趣的是,我认为它也是这样工作的。我不太喜欢“头先”系列的另一个原因。ServerSocket(我)?你的意思是:ServerSocket(端口)?这不起作用吗,因为当它第一次返回ServerSocket时,它停止了功能?谢谢你的澄清。我刚刚上传了一张书中的图片,你能看一下吗?嗨,SimonJ,你能解释一下为什么服务器端可以使用同一个套接字端口吗?谢谢!@MrROY,因为客户端随机选择了它的本地端口,就像他在回答中说。@EJP客户端选择它的本地端口是可以的。但问题是服务器建立在5050上,在其他条目中仍然在监听同一端口5050。为什么它使用同一个套接字端口?@chs_Infinity我不知道你在问什么。服务器套接字继续使用端口5050,以便新的客户端可以连接到它。新的连接在服务器端使用端口5050,因为协议就是这样定义的。可能的原因是连接的“标识”基于5元组:(源IP、源端口、目标IP、目标端口、协议(tcp或udp))。更改一个字段(通常是源端口)就足以生成新的、不同的连接。 simon@lucifer:~$ netstat -n -a Active Internet connections (including servers) Proto Recv-Q Send-Q Local Address Foreign Address (state) ... tcp4 0 0 127.0.0.1.64895 127.0.0.1.5050 ESTABLISHED <- 1 tcp4 0 0 127.0.0.1.5050 127.0.0.1.64895 ESTABLISHED <- 2 tcp46 0 0 *.5050 *.* LISTEN <- 3 ...