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