2015-02-10 185 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

相關問題