我正在编写一个简单的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导致等待,这个空查询是什么以及它在哪里来自?