Windows上的Socket InputStream阻塞和交换查询

问题描述 投票:0回答:1

我正在编写一个简单的ServerSocket程序,并通过网址从两个浏览器标签连接到它:http://127.0.0.1:8080/Q1并在暂停10秒后http://127.0.0.1:8080/Q2

我的问题是在使用java10的ubuntu18机器上它工作得很快很好。但是在两台win机器上(我的win8.1用java8和其他带有java11的win10)它在第一次查询后挂断,并且在2分钟内什么都不做,如果我不发送第二个查询,服务器会保持安静。如果我发送第二个查询,我会在浏览器中获得两个查询的结果(在第一季度Q2然后是Q1的交换顺序),我的服务器报告读取两个查询,接下来两个浏览器对于favicons(在第一季度Q2然后在90%的情况下为Q1)。

如果我在启动Q1之后等待(不启动Q2),首先我看到Socket#1已创建并等待。等待2分钟后关闭。然后片刻服务器创建#2套接字并快速回答Q1,关闭,创建#3套接字获取并回答Q1-favicon查询,该浏览器发送。一切都做得非常快,很漂亮。我不希望#1 Socket暂停。我在ubuntu18机器上没有它。

我究竟做错了什么?或者我的胜利机器有问题吗?您的win机器是否先处理查询而不等待第二次查询?

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,而服务器接受() - 只有一个--50411。看起来像50410导致等待,这个空查询是什么以及它在哪里来自?Wireshark screenshot

java networking io inputstream serversocket
1个回答
-1
投票

similar问题中,我发现了一个有用的link,它可能是由“预测网络操作以提高页面加载性能”设置引起的。所以我尝试逐个关闭预测设置并且有效。在Chrome版本73.0.3683.86(官方构建)(64位)中,此行为是由Chrome设置“使用预测服务加载页面更快”打开引起的。

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

© www.soinside.com 2019 - 2024. All rights reserved.