Windows块上的套接字InputStream并交换查询

时间:2019-03-29 10:14:48

标签: java networking io inputstream serversocket

我正在编写一个简单的ServerSocket程序,并通过两个浏览器选项卡通过URL http://127.0.0.1:8080/Q1并在10秒钟暂停后http://127.0.0.1:8080/Q2连接到它。

我的问题是,在具有java10的ubuntu18机器上,它可以快速而良好地工作。但是在两台Win机器上(我的win8.1和java8以及其他win10和java11),它在第一次查询后挂断,最多2分钟不执行任何操作,如果我不发送第二次查询,服务器保持安静。如果我发送第二个查询,则会在浏览器中得到两个查询的结果(先交换顺序是第一个Q2,然后是Q1),并且我的服务器报告读取了两个查询,接下来的两个浏览器也显示了收藏夹图标(也被交换-在90%的情况下,第一个Q2然后是Q1)。

如果我在启动Q1之后只是等待(没有启动Q2),则首先我看到Socket#1已创建并且正在等待。等待2分钟后关闭。然后,服务器会立即创建#2套接字并在Q1上快速回答,然后关闭,创建#3套接字获取并回答浏览器发送的Q1-favicon查询。一切都非常快速和美观。我不想在#1套接字上暂停一下。我在ubuntu18机器上没有它。

我在做什么错?还是我的赢奖机出问题了?您的获胜机器是否在不等待第二个查询的情况下处理第一个查询?

import java.io.PrintWriter;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.net.Socket;
import java.net.ServerSocket;
import java.util.stream.Collectors;
import java.io.IOException;

public class localhost {
    public static void main(String[] args) {
        int portNumber = 8080;
        System.out.println("Started...");
        String s="#";
        String ans="#";
        try (
        ServerSocket serverSocket = new ServerSocket(portNumber)){
            String httpResponse;
            int i=0;
            while(true){
                i++;
                System.out.println("Creating new Clien Socket #"+i);
                try( Socket clientSocket = serverSocket.accept()){
                    System.out.println("Accepted... "+clientSocket.toString());
                    try(InputStream in=clientSocket.getInputStream();){
                        {byte[] buffer = new byte[10000];
                        int total = in.read(buffer);
                        if (total>0) {
                            s = new String(java.util.Arrays.copyOfRange(buffer, 0, total));
                            System.out.println(s);

                            httpResponse = "HTTP/1.1 200 OK\r\n\r\nHello, there, "+ s.substring(5,7) +"!";
                            OutputStream out=clientSocket.getOutputStream();
                            out.write(httpResponse.getBytes());
                        } else { System.out.println("Empty..."); }
                        System.out.println("Finished #"+i+" "+clientSocket.toString());
                        System.out.println();}
                    }
                }
            }

        } catch(Exception e){
            System.out.println("Error: "+e);
        }
        System.out.println("I'm done "+s);
    }
}

UPD:对于没有Q2情况的Q1,如果我没弄错,Wireshark显示两个套接字-50410和50411,而服务器accept()-ed仅一个-50411。貌似50410导致等待,这是空查询,它来自哪里?Wireshark screenshot

1 个答案:

答案 0 :(得分:-1)

在一个similar问题中,我找到了一个有用的link,它说这可能是由“预测网络操作以改善页面加载性能”设置引起的。因此,我尝试了一个一个地关闭预测设置,并且它起作用了。在Chrome版本73.0.3683.86(官方内部版本)(64位)中,此行为是由Chrome设置“使用预测服务更快地加载页面”引起的。

因此,只需进入设置->高级->隐私和安全->使用预测服务可以更快地加载页面并将其关闭。 (或者,如果您的Chrome版本没有该功能,请尝试关闭类似的设置)。