Как сделать так, чтобы мой автоматический клиент-серверный сетевой код Java выводился в правильной последовательности?

Позвольте мне начать с того, что я знаю, что это много кода, поэтому, пожалуйста, потерпите меня. Я работаю над проектом, куда я портируюКлиент-сервер Oracle Knock-Knock пример в пример государства-капитала США. Таким образом, вместо шуток KnockKnock, он запускает серию запросов капитала штата. Это работает примерно так:

Сервер: Могу ли я получить разрешение на отправку запроса о капитале штата?

Клиент: ОК

Сервер: Отправить мне состояние, чтобы я мог отправить капитал?

Клиент: Алабама

Сервер: Столица Алабамы - Ханствилл. Хотите еще один (да / нет)?

Клиент: n

Мотивация для этого проекта заключается в том, чтобы позже продемонстрировать некоторый тип отказоустойчивой способности (после того, как я заставлю это работать, я хочу использовать Powershell и использовать его для запуска клиент-сервер как единого модуля).

Вернуться к моему коду. Когда я запускаю его, он дает мне следующий вывод, который я не ищу. Он должен быть синхронизирован так, чтобы клиент и сервер работали в одном состоянии одновременно. Вместо этого, клиентская сторона прыгает впереди серверной части и не достигает последнего состояния Вайоминга. Я пытался добавить в некоторой синхронизациисогласно этому вопросу.

Я связал полный код на pastebin

FixedMessageSequenceClient

FixedMessageSequenceServer

FixedMessageSequenceProtocol

В коде я использую простой текстовый файл журнала целых чисел:

1
2
3
4

Примечание: я использую ApacheReversedLinesFileReader библиотека

У меня есть подозрение, что моя ошибка из-за того, что Java IO пишет слишком долго. Я думаю, что это может быть из-за этого блока кода:

<pre><code>for (int i = modlastNum; i < KKJokes.length ; i++){ String fromServer = br.readLine(); out.println(KKJokes[ i % KKJokes.length ]); if ( (i % 3 )==2){ try { Thread.sleep(11); } catch (InterruptedException ie) {} } // fromServer = br.readLine(); System.out.println ( fromServer ); fromServer = br.readLine(); System.out.println ( fromServer ); // String fromServer3 = br.readLine(); System.out.println ( fromServer3 ) ; System.out.println ( fromServer ) ; if(fromServer.equals("inputOfYes")){ while (!(fromServer.equals("nowlogged"))) { fromServer = br.readLine(); } } System.out.println ( fromServer ) ; } // end-forLoop starting at Ln. 93 </code></pre>

Итак, я догадываюсь, что моя автоматическая отправка запросовFixedMessageSequenceServer класс (посредствомFixedMessageSequenceProtocol класс), возможно, идет слишком быстро, и, возможно, IO внутриFixedMessageSequenceClient является узким местом.

Любые советы относительно того, как отладить это или выяснить, приветствуются, спасибо

Ответы на вопрос(1)

Ваш ответ на вопрос