Wie gebe ich meinen automatisierten Client-Server-Java-Netzwerkcode in der richtigen Reihenfolge aus?

Lass mich anfangen zu sagen, dass ich weiß, dass dies viel Code ist, und bitte trage es mit mir. Ich arbeite an einem Projekt, in dem ich portiere Oracle Knock-Knock Client / Server Beispiel in ein US State-Capital-Beispiel. Anstelle von KnockKnock-Witzen werden also eine Reihe von Abfragen zur Landeshauptstadt ausgeführt. Es läuft ungefähr so:

Server: Darf ich Ihnen die Erlaubnis geben, eine Abfrage nach dem Bundesstaat zu senden?

Client: Ok

Server: Senden Sie mir einen Bundesstaat, damit ich ein Kapital senden kann?

Client: Alabama

Server: Die Hauptstadt von Alabama ist Hunstville. Willst du noch einen (j / n)?

Client: n

Die Motivation für dieses Projekt besteht darin, später eine Art von Ausfallsicherheit zu demonstrieren (nachdem dies funktioniert, möchte ich Powershell verwenden und damit den Client-Server als eine Einheit ausführen).

Zurück zu meinem Code. Wenn ich es starte, erhalte ich die folgende Ausgabe, nach der ich nicht suche. Es soll synchronisiert werden, damit der Client und der Server jeweils in einem Zustand arbeiten. Stattdessen springt die Clientseite der Serverseite voraus und erreicht nicht den letzten Bundesstaat Wyoming. Ich habe versucht, in einigen Synchronisation hinzufügen wie bei dieser Frage.

Ich habe den vollständigen Code auf Pastebin @ verlin

FixedMessageSequenceClient

FixedMessageSequenceServer

FixedMessageSequenceProtocol

Im Code verwende ich eine einfache Textprotokolldatei mit ganzzahligen Zahlen:

1
2
3
4

Hinweis: Ich benutze den Apache ReversedLinesFileReader Bibliothek

Ich habe den Verdacht, dass mein Fehler auf das zu lange Schreiben von Java IO zurückzuführen ist. Ich denke, es kann an diesem Codeblock liegen:

<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>

And so ist meine Vermutung, dass mein automatisches Senden von Anfragen an dieFixedMessageSequenceServer Klasse (über dasFixedMessageSequenceProtocol Klasse) geht vielleicht zu schnell, und vielleicht das IO innerhalb vonFixedMessageSequenceClient ist ein Engpass.

jegliche Tipps zum Debuggen oder Herausfinden von Fehlern sind willkommen, danke

Antworten auf die Frage(2)

Ihre Antwort auf die Frage