Почему java ServerSocket теряет первое соединение? - PullRequest
0 голосов
/ 27 марта 2019

Я пытаюсь написать очень простой java-сервер, который в основном copy-paste из Oracle, учебник и доступ к нему из браузера через мою локальную сеть IP 192.168.0.106/?Q1.

Моя программа выводит "Ready ..." в терминале, но не выводит запрос браузера Q1. Затем я делаю второй запрос Q2 к тому же IP и программа печатает его: «GET /? Q2 HTTP / 1.1 ...».

Когда я выполняю тот же запрос к 127.0.0.1 (Q1 и Q2), неожиданно программа выводит «Ready ...» в первом запросе, но печатает «null» во втором.

Почему я теряю свой первый запрос? Мой in.readLine () вызывает это? И почему при подключении к адресу обратной петли 127.0.0.1 я могу установить соединение, но не могу распечатать мой запрос?

    int portNumber = 80;
    System.out.println("Started...");
    String s="#";

    try ( 
    ServerSocket serverSocket = new ServerSocket(portNumber);
    Socket clientSocket = serverSocket.accept();
    PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
    BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
    ) {
        System.out.println("Ready...");
        s=in.readLine(); /// Let's take first line only
        System.out.println(s);

    } catch(Exception e){
        System.out.println("Error "+e);
    }

Я бы хотел видеть первый запрос в выводе: "GET /? Q1 ...". Спасибо.

1 Ответ

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

Получите те пакеты, где не потеряно .Похоже, что они были переставлены , возможно, из-за стековой природы InputBuffer (или нет): сначала в - потом в выход.И поскольку программа должна была показывать только один ответ, после закрытия соединения без HTML-данных она показала последний запрос, который вошел в очередь.Перестановка была вызвана пустым tcp-пакетом, который chrome ( v73 с Use a prediction service to load pages more quickly ON ) отправил перед фактическими запросами.Так как он был пустым, InputBuffer оставался заблокированным до тех пор, пока это tcp-соединение не было закрыто.И входящие соединения складывались.Пустое соединение будет закрыто Chrome по тайм-ауту через 2 минуты или когда произойдет перезагрузка страницы и будет обработано следующее ожидающее соединение.Это будет Q2, но это не значит, что Q1 потерян - он просто ожидает обработки или отбрасывания следующего пустого пакета.

...