In meinem einfachen Java Client-Server-Programm, beim Senden einer Nachricht an den Server und Lesen dort, readInt()
liest unbegrenzt, so dass das Programm dort bleiben.Server Socket liest Client-Nachricht unbegrenzt in Java
ich sicher, dass ich nur das Senden und ein int, sonst nichts empfangen, wie Sie durch den Code sagen kann (ich auch versucht, mit und ohne \n
an die Nachricht angehängt wird gesendet, um zu sehen, ob es enden würde):
Relevante Client-Code-
Socket server = new Socket("127.0.0.1", 2424);
DataOutputStream outputStream = new DataOutputStream(server.getOutputStream());
DataInputStream inputStream = new DataInputStream(server.getInputStream());
outputStream.writeInt(Protocol.Message.HANDSHAKE);
outputStream.write('\n'); // I tried with and without this
outputStream.flush();
Relevante Server-Code
ServerSocket socket = new ServerSocket(2424);
System.out.println("Listening on port 2424");
while (connected) {
Socket client = socket.accept();
System.out.println("SERVER: Going to read a message"); // This shows
int messageType = (new DataInputStream(client.getInputStream())).readInt();
System.out.println("SERVER: Received a message (" + messageType + ")"); // This does not
commands.execute(messageType);
}
Die Nachricht, die nach readInt()
gedruckt werden soll, wird nie angezeigt. Ich dachte, es wäre, da ich nur ein int senden und ein int empfangen (4 Bytes), es ist nicht so, dass ich mehr Daten als erwartet gesendet habe.
Wie soll ich das readInt()
Ende machen? Muss ich ein Nullbyte oder etwas anderes senden?
EDIT: Tatsächlicher Server-Code (mit Threads).
ServerSocket socket = new ServerSocket(2424);
System.out.println("Listening on port 2424");
while (connected) {
Socket client = socket.accept();
Worker worker = new Worker(client);
worker.start();
}
Worker-Thread
public class Worker extends Thread {
private final Socket client;
private final Commands commands;
private final DataOutputStream outputStream;
private final DataInputStream inputStream;
public Worker(Socket client) throws IOException {
System.out.println("SERVER: Handling client message");
this.client = client;
outputStream = new DataOutputStream(client.getOutputStream());
inputStream = new DataInputStream(client.getInputStream());
commands = new Commands();
commands.addCommand(Protocol.Message.HANDSHAKE, new HandshakeCommand());
//commands.addCommand(Protocol.Message.RECEIVE_FILE, new ReceiveFileCommand());
}
@Override
public void run() {
System.out.println("SERVER: Running thread for client message");
try {
int messageType = inputStream.readInt();
System.out.println("SERVER: Received a message (ID " + messageType + ")");
commands.execute(messageType);
} catch (IOException | UnknownCommandException ex) {
System.out.println(ex);
}
}
}
Ich habe gerade Ihren Code getestet und es funktioniert wie erwartet auf meinem Rechner. Ich habe 'outputStream.writeInt (42);' verwendet und der Server hat es mit 'SERVER empfangen: Eine Nachricht erhalten (42)'! Entweder starten Sie Ihren Server und Client nicht einmal richtig oder es gibt ein anderes Netzwerkproblem mit dem Port oder was haben Sie versucht? – xander
Der Server-Code delegiert eigentlich jeden 'socket.accept()' in einen neuen Thread, aber ich denke nicht, dass das in irgendeiner Weise einen Einfluss darauf hätte? Ich gebe es noch einmal und komme mit Ergebnissen zurück. Auch jede Erklärung über die '\ n'? Muss ich das in die Nachricht aufnehmen oder nicht? –
Sie müssen das '\ n' oder irgendetwas anderes nicht senden, das' DataInputStream.readInt() 'auf der Serverseite blockiert den Thread, bis 4 Bytes angekommen sind, und wandelt es dann in ein 4-Byte int um. Wahrscheinlich schickst du nie 4 Bytes an den Server-Socket. Wenn Sie zusätzlichen Thread verwenden, stellen Sie möglicherweise eine minimale Version bereit, die nicht funktioniert, da der Code aus Ihrer Frage keine Fehler enthält. Sie können es selbst ausprobieren, wenn dieser Code für Sie funktioniert. – xander