내 간단한 Java 클라이언트 - 서버 프로그램에서 서버에 메시지를 보내고 거기에서 읽을 때 readInt()
은 무기한 읽습니다. 나는 단지 보내고 당신이 코드에 의해 말할 수있는, 다른 사람의 int, 아무것도 수신되지 않은 것을 확인했다Server Socket은 Java에서 클라이언트 메시지를 무한대로 읽습니다.
는 (I는 또한 끝낼 것입니다 있는지 확인하기로하고 보낸 메시지에 \n
를 추가하지 않고 시도) :
관련 클라이언트 코드
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();
관련 서버 코드
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);
}
readInt()
뒤에 인쇄해야하는 메시지는 표시되지 않습니다. 나는 int를 보내고 int (4 바이트)를받은 이후로 생각했습니다. 예상보다 많은 데이터를 보내는 것과 같지 않았습니다.
readInt()
을 어떻게 끝내야합니까? null 바이트 또는 다른 것을 보내야합니까?
편집 : 실제 서버 코드 (스레드 사용).
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();
}
작업자 스레드
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);
}
}
}
방금 코드를 테스트했으며 내 컴퓨터에서 예상대로 작동합니다. 나는'outputStream.writeInt (42); '를 사용했고 서버는'SERVER : 메시지를 받았다. 따라서 서버와 클라이언트를 제대로 시작하지 않거나 포트에 다른 네트워크 문제가 있거나 시도한 사항이 있습니까? – xander
서버 코드는 실제로 각각의'socket.accept()'를 새로운 스레드로 위임합니다. 그러나 어떤 식 으로든 영향을 줄 것이라고 생각하지 않습니다. 나는 그것을 다시주고 결과로 돌아올거야. 또한 '\ n'에 대한 설명이 있습니까? 나는 그 메시지에 그 것을 포함시켜야합니까 안되나요? –
당신은'\ n' 또는 다른 것을 보낼 필요가 없습니다. 서버 측의'DataInputStream.readInt()'는 4 바이트가 도착할 때까지 스레드를 차단 한 다음 그것을 4 바이트 int로 변환합니다. 따라서 대부분 서버 소켓에 4 바이트를 보내지 않습니다. 여분의 스레드를 사용하는 경우 문제의 코드에 오류가 없으므로 작동하지 않는 최소 버전을 제공 할 수 있습니다. 코드가 작동하면 직접 시도해 볼 수 있습니다. – xander