2014-10-10 46 views
0

我有這個小的Java HTTP服務器:谷歌chrome多次連接到Java的HttpServer

public class HttpServer { 
    public static void main(String args[]) { 
     int port; 
     ServerSocket server_socket; 
     try { 
      port = Integer.parseInt(args[0]); 
     } catch (Exception e) { 
      port = 8080; 
     } 
     try { 
      server_socket = new ServerSocket(port, 0, InetAddress.getByName("localhost")); 
      System.out.println("httpServer running on port " 
        + server_socket.getLocalPort() 
        + " address " + server_socket.getInetAddress() 
      ); 
     } catch (IOException e) { 
      System.out.println(e); 
     } 
    } 
} 

當我用谷歌瀏覽器連接到localhost IDE控制檯寫入以下內容:

httpServer running on port 8080 address localhost/127.0.0.1 
New connection accepted /127.0.0.1:54839 
New connection accepted /127.0.0.1:54840 

好像谷歌瀏覽器連接兩次到服務器,但更改其端口。 爲什麼會這樣?

+0

您還有其他事情正在瀏覽器頁面上進行。 Chrome只會連接到您的URL中的端口,可能是端口8080.這些其他連接正在被別的東西分離出來。擴展,JavaScript邏輯等 – BrianC 2014-10-10 17:47:05

+0

127.0.0.1:54839和127.0.0.1:54840是請求來自的地方,而不是它們被接收的地方,127.0.0.1:8080。我看到了運行節點服務器並使用Chrome或IE瀏覽器發生同樣的事情。 – samaspin 2014-11-19 16:18:23

回答

0

由於客戶端上的端口8080已被佔用,客戶端的操作系統會將連接映射到客戶端上的其他未使用的端口。您的客戶端從端口54839和54840連接到服務器上的端口80。要允許另一個客戶端連接到您的服務器,端口會自動重定向到未被佔用的端口。

這裏是發生了什麼列表...

  1. 客戶端打開了一個套接字連接到您的服務器
  2. 客戶機的操作系統檢查以使用套接字嘗試連接的端口,如果不尋找一個未使用的端口。
  3. 客戶端操作系統將套接字分配給在步驟2中檢測到的未使用本地端口。
  4. 服務器接收到連接請求並接受它。服務器的操作系統將連接從端口8080重定向到另一個端口,以允許更多客戶端進行連接。
  5. 客戶端和服務器進行聊天並斷開連接。

54839和54840是操作系統分配給您的瀏覽器在嘗試連接到本地網站時創建的兩個套接字的端口。


編輯:要正確回答您的問題,您發送瀏覽器的資源會導致它連接兩次。一次檢索第一個資源,第二個檢索第一個需要的資源。