Я пишу простую программу ServerSocket и подключаюсь к ней из двух вкладок браузера по URL: http://127.0.0.1:8080/Q1 и после 10-секундной паузы http://127.0.0.1:8080/Q2.
Моя проблема в том, что на машине с Ubuntu18 с java10 она работает быстро и хорошо. Но на двух машинах win (мой win8.1 с java8 и другие win10 с java11) он зависает после первого запроса и ничего не делает в течение 2 минут, сервер остается тихим, если я не отправляю второй запрос. Если я отправляю второй запрос, я получаю результат для обоих запросов (в порядке подстановки сначала Q2, затем Q1) в браузере, и мой сервер сообщает о чтении обоих запросов, а следующие два браузера делают для значков (поменял местами тоже - сначала Q2, затем Q1 в 90% случаев).
И если я просто подожду после запуска 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: для случая Q1 без Q2, если я правильно понял, Wireshark показывает два сокета - 50410 и 50411, а сервер accept () - только один - 50411. Похоже, 50410 вызывает ожидание, что это за пустой запрос и откуда это?