Сокет InputStream для оконных блоков и своп-запросов - PullRequest
0 голосов
/ 29 марта 2019

Я пишу простую программу 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 вызывает ожидание, что это за пустой запрос и откуда это? Wireshark screenshot

1 Ответ

0 голосов
/ 30 марта 2019

В подобном вопросе я обнаружил полезную ссылку , в которой говорится, что она может быть вызвана параметром «Предсказать действия сети для улучшения производительности загрузки страницы». Поэтому я попытался отключить параметры прогнозирования по одному, и это сработало. В chrome версии 73.0.3683.86 (официальная сборка) (64-разрядная версия) это вызвано включенной настройкой chrome «Использовать службу прогнозирования для более быстрой загрузки страниц».

Так что просто перейдите к настройке -> Дополнительно -> Конфиденциальность и безопасность -> Используйте службу прогнозирования, чтобы быстрее загружать страницы и выключать ее. (Или, если у вас его нет в вашей версии Chrome, попробуйте отключить аналогичные настройки).

...