Um ganz transparent zu sein, ist dies für eine Aufgabe.Gepufferte Reader für einen Sockel ist nie fertig
Es gibt mehr zu tun, aber im Moment versuche ich nur folgendes zu erhalten:
- Knoten A liest aus einer Textdatei
- Knoten Eine Textdatei (minus der erste sendet Linie) unter Verwendung eines B-Buchse
- Knoten B an, die aus dem Sockel, und druckt es aus an die Konsole
jedoch jetzt mit dem Knoten entweder scheint es, dass die Information nicht gesendet wird, oder es wird nicht korrekt gelesen ctly von Knoten B.
In meiner Hauptklasse, ich die Knoten wie folgt aufgebaut:
NodeA nodeA = new NodeA();
NodeB nodeB = new NodeB();
new Thread(nodeA).start();
new Thread(nodeB).start();
In Knoten A, mache ich das:
//Open a socket for talking with NodeB
Socket mySocket = new Socket(InetAddress.getLocalHost(), portNum);
//Set up the socket's output
PrintWriter out = new PrintWriter(mySocket.getOutputStream(), true);
//Loop through the lines of the confA file, writing them to the socket
String line = bufferedReader.readLine();
while (line != null)
{
//Write the line to the socket, get the next line
out.println(line); //updated to println, this flushes and fixes another problem
out.flush();
line = bufferedReader.readLine();
}
//Close the socket
mySocket.close();
Beachten Sie, dass Knoten A-Schleife funktioniert fein. Es wird nicht für immer wiederholt und durchläuft die beabsichtigten Textzeilen, wenn ich mit Druckanweisungen teste.
Dann, am Knoten B Ende: Aktualisiert aktuellen Knoten B Code
//Open the socket
ServerSocket mySocket = new ServerSocket(portNum);
Socket connectionSocket = mySocket.accept();
//Set up a reader on the socket to get what's coming from it
BufferedReader in = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));
String line = in.readLine(); //hang occurs here
while(line != null) {
System.out.println(line);
line = in.readLine();;
}
jedoch in.ready() zu zeigen, ist nie wahr. Ich habe versucht, darauf zu warten, dass dies mit einer while-Schleife passiert, aber es kommt nie vor.
Ich bin mir wirklich nicht sicher warum. Ich habe keine Ahnung, ob ich den Socket korrekt eingerichtet habe, ob ich den Server korrekt eingerichtet habe, ob ich richtig zuhöre usw.
Ich dachte nur, dass es am sinnvollsten ist, B zu einem Server zu machen, der auf A hört . Ich hoffe, das stimmt. Es sieht ähnlich aus wie einige andere Beispiele auf SO.
Vielen Dank für jede Hilfe. Ich bin extrem mit Sockets, Ports, zuhören und sonst nicht vertraut, also vergib mir, wenn ich deine Vorschläge zuerst nicht verstehe. Ich werde mein Bestes geben, um es zu verstehen, während ich gehe.
Ich habe davon Abstand genommen, den ganzen Code hinzuzufügen, um es hoffentlich lesbarer zu machen und klar zu machen, wo das Problem sein könnte, aber wenn Sie mehr Informationen brauchen, zögern Sie nicht zu fragen und ich werde mein Bestes geben.
1) Jedes Mal, wenn 'ServerSocket.accept()' zurückkehrt, haben Sie einen verbundenen Socket zwischen Server und Client eingerichtet. Für * diese * Verbindung rufen Sie 'ServerSocket.accept()' nicht erneut auf. 2) In Ihrem Client puffert der PrintWriter Daten intern. Wenn das Ergebnis des Aufrufs von 'out.print (line);' sofort im Netzwerk angezeigt werden soll, müssen Sie 'out.flush() 'als nächste Anweisung aufrufen. –
Alles 'ready()' gibt zurück, ob der nächste Lesevorgang sofort zurückkehrt. Siehe [die Dokumentation] (https://docs.oracle.com/javase/9/docs/api/java/io/Reader.html#ready--). – VGR