2015-02-10 150 views
1

我正在做一个简单的练习来理解套接字和服务器套接字。当myServerSocket = new ServerSocket(0)端口被随机分配到该插座。我想知道如何设置客户端连接到该端口。如果客户端随机分配,客户端如何查找侦听端口?Java客户端/服务器套接字端口分配

下面是代码从服务器和客户端类的代码片段:

服务器:

public static void main(String[] args) { 

    try { 
     // First we create a server socket and bind it to a random port. 
     ServerSocket myServerSocket = new ServerSocket(0); 


     // wait for an incoming connection... 
     System.out.println("Server is waiting for an incoming connection on host=" 
       + InetAddress.getLocalHost().getCanonicalHostName() 
       + " port=" + myServerSocket.getLocalPort()); 
     Socket skt = myServerSocket.accept(); 

客户:

public static void main(String[] args) { 

    // create a socket and bind it to the host/port server is listening on. 
    String host; 
    int port; 

    if(args.length==0) { 
     host = "localhost"; 
     port = 9999;   
    } else { 
     host = args[0]; 
     String portStr = args[1]; 
     try { 
      port = Integer.parseInt(portStr); 
     } catch (NumberFormatException nfe) { 
      System.out.println("Whoops, invalid port number. Will default to 9999"); 
      port = 9999; 
     } 
    } 
+2

客户端必须知道服务器侦听的确切端口号 – 2015-02-10 20:43:12

+0

上述内容。否则某种类型的端口扫描,但我猜测,除非使用一些启发式(或随机端口函数的最小值[即范围]收紧),否则需要很长时间才能通过所有端口。 – noumenal 2015-02-10 20:47:05

回答

2

客户端有三个选项找到侦听端口:端口扫描,用户输入或共享目录。

端口扫描

客户端可以尝试连接到服务器上的所有有效的端口;当它与您的服务器程序成功通信时,它可以停止尝试其他端口。

用户输入

一旦你启动服务器,你就会知道指定的端口。只需编写一个接口在客户端输入,客户端就可以正常继续。

共享目录

在这种情况下,服务器可以对第三个服务器,告诉它结束了使用什么端口的请求。客户端然后向第三台服务器发出请求以查找端口。这绝对是最复杂的选择,因为它依赖于混合中的另一台服务器。

+1

另外,在本地网络上,您可以使用UDP来广播您的可用性。 – 2015-02-10 20:54:51

1

服务器的正常程序是使用所有客户端都知道的套接字端口。这就是为什么有一些众所周知的端口列表,以便诸如Web服务器,FTP服务器,telnet服务器等众所周知的服务器都有标准的端口。希望连接到这些服务器的客户端使用众所周知的端口作为连接请求的一部分。

然而在你的情况下,你可能会考虑做的是让服务器获取它的端口,然后发布它正在使用的端口号。

或者你可能做的是不使用随机端口来选择服务器将使用的端口。

如果您决定选择一个端口,则应该使用除Wikipedia list of well known ports中提供的众所周知的端口之外的端口。

发布端口号意味着您需要某种方式让客户端发现您用于服务器的端口。有很多不同的方法可以解决这个问题,但是它们都可以共享客户端以某种已知方式查询某些已知设备或服务器的能力。您可能有某种提供服务器查找目录的服务器,因此客户端会请求从服务器使用该端口,例如Service Name and Transport Lookup Service

相关问题