【问题标题】:Why is java ServerSocket loses first connection?为什么 java ServerSocket 失去第一个连接?
【发布时间】:2019-03-27 10:54:53
【问题描述】:

我正在尝试编写一个非常简单 java 服务器,它主要是来自Oracle tutorial 的复制粘贴,并通过我的 LAN IP 192.168 从浏览器访问它。 0.106/?Q1。

我的程序在终端输出“Ready...”,但不输出浏览器查询 Q1。然后我对同一 IP 进行第二次查询 Q2 并程序打印它:“GET /?Q2 HTTP/1.1...”。

当我对 127.0.0.1(Q1 和 Q2)执行相同的查询时,程序在第一次查询时会输出“Ready...”,但在第二次查询时会输出“null”。

为什么我丢失了我的第一个查询?是我的 in.readLine() 造成的吗?为什么在连接到回送 127.0.0.1 地址时我可以连接,但无法打印我的查询?

    int portNumber = 80;
    System.out.println("Started...");
    String s="#";

    try ( 
    ServerSocket serverSocket = new ServerSocket(portNumber);
    Socket clientSocket = serverSocket.accept();
    PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
    BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
    ) {
        System.out.println("Ready...");
        s=in.readLine(); /// Let's take first line only
        System.out.println(s);

    } catch(Exception e){
        System.out.println("Error "+e);
    }

我希望在输出中看到第一个查询:“GET /?Q1...”。谢谢。

【问题讨论】:

  • 此代码不能接受多个查询,或打印多行。您需要从accept() 开始并以缺少的close() 结束所有I/O 循环。如果您没有看到 Q1,那么您将其定向到了错误的主机。
  • 我知道它不能接受多个查询。这是故意定位问题的。即:第一个连接丢失。我已将查询定向到相同的主机 - 我已经完成了大约 30 次,结果相同。你说这个代码打印你 Q1 吗?

标签: java networking io


【解决方案1】:

找出那些没有丢失的数据包。看起来它们被重新排列可能是由于 InputBuffer(或不是)的堆栈性质:先进 - 后出。由于程序只显示一个答案,因此在没有 html 数据的情况下关闭连接后,它显示了最后一个进入队列的查询。重新排列是由 chrome (v73 with Use a prediction service to load pages more quickly turned ON) 在实际查询之前发送的空 tcp 数据包引起的。由于它是空的,因此 InputBuffer 一直处于阻塞状态,直到此 tcp 连接关闭。传入的连接正在堆积。 Chrome 将在 2 分钟内超时或页面重新加载时关闭空连接,并处理下一个挂起的连接。这将是 Q2,但这并不意味着 Q1 丢失 - 它只是等待处理或丢弃下一个空数据包。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-21
    相关资源
    最近更新 更多