2010-11-29 45 views
10

谁知道在使用ServerSocket类的accept方法时如何选择端口?可以为方法可以选择的端口定义一个范围吗?我可以按顺序“一个接一个”进港吗?ServerSocket accept()方法

ServerSocket sSocket = new ServerSocket(5050); 
Socket socket = sSocket.accept(); 

From the book

+0

尝试getLocalPort并查看是否为真。 – Codemwnci 2010-11-29 20:18:23

+4

这是一本你正在阅读的好书吗? “普通旧插座”听起来很奇怪。 – 2010-11-29 20:34:20

+0

是的,它是Head First Java,一本适合初学者的书。 – Eugene 2010-11-29 20:37:48

回答

20

该图不正确(并在O'Reilly站点的unconfirmed errata中列出)。

客户随机地选择端口(你不需要做任何事情在Java中特殊),并连接到哪个端口指定的服务器。使用netstat命令行工具,你可以看到这一点 - 第一,只是监听服务器套接字的无客户端:

 
[email protected]:~$ netstat -n -a 
Active Internet connections (including servers) 
Proto Recv-Q Send-Q Local Address   Foreign Address  (state) 
... 
tcp46  0  0 *.5050     *.*     LISTEN 
... 

(有很多其他项目的,我只是删除了无关的内容)

现在用1个客户从本地主机连接(127.0.0.1):

 
[email protected]:~$ 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 
... 

由于客户端从同一台机器进行连接,我们看到了两个建立的连接 - 一个从客户端到服务器(1),其他从服务器到客户端(2)。他们有相反的本地和外部地址(因为他们正在互相交谈),并且您可以看到服务器端仍在使用端口5050,而原始服务器套接字(3)继续在同一端口上侦听。

(这些是从Mac,但Windows/Linux还具有netstat给予相似的输出)

0

ServerSocket端口定义为构造的一部分。 如果您未指定端口,则套接字未被绑定(即无法访问)。

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

0

您可以通过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."); 
} 

的循环不处理另一个异常(例如,SecurityException),但可以添加它。

2

一个TCP连接由四个部分组成:

  • 客户端IP
  • 客户端端口
  • 服务器IP
  • 服务器端口

可以有,例如,多个客户端连接到相同的服务器端口 - 只要客户端没有相同的IP 相同的prt,没关系。对于这一部分,操作系统需要谨慎。

所以完全可以在一个端口上进行监听。

5

选择的端口,当你说新的ServerSocket(5050)。所有关于为接受的套接字使用不同端口的内容都是100%BS。

相关问题