Google Chrome多次连接到Java HttpServer

时间:2014-10-10 16:15:53

标签: java httpserver

我有一个小的java http服务器:

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);
        }
    }
}

当我使用google chrome连接到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

似乎谷歌Chrome连接两次到服务器,但更改其端口。 为什么会这样?

1 个答案:

答案 0 :(得分:0)

由于客户端上的端口8080已被占用,因此客户端的操作系统会将连接映射到客户端上的其他未使用端口。您的客户端从端口54839和54840连接到服务器上的端口80。要允许其他客户端连接到您的服务器,该端口将自动重定向到未使用的端口。

这里列出了发生的事情......

  1. 客户端打开一个Socket以连接到您的服务器
  2. 客户端操作系统检查是否使用了Socket尝试连接的端口,如果没有查找未使用的端口。
  3. 客户端操作系统将套接字分配给它在步骤2中检测到的未使用的本地端口。
  4. 服务器接收连接请求并接受它。服务器的操作系统将连接从端口8080重定向到另一个端口,以允许更多客户端连接。
  5. 客户端和服务器进行聊天,然后断开连接。
  6. 54839和54840是操作系统分配给您尝试连接到本地网站时浏览器创建的两个套接字的端口。


    编辑:要正确回答您的问题,您发送浏览器的资源会使其连接两次。一旦检索第一个资源,第二次检索第一个需要的资源。