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