-1

내 간단한 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); 
     } 
    } 
} 
+0

방금 ​​코드를 테스트했으며 내 컴퓨터에서 예상대로 작동합니다. 나는'outputStream.writeInt (42); '를 사용했고 서버는'SERVER : 메시지를 받았다. 따라서 서버와 클라이언트를 제대로 시작하지 않거나 포트에 다른 네트워크 문제가 있거나 시도한 사항이 있습니까? – xander

+0

서버 코드는 실제로 각각의'socket.accept()'를 새로운 스레드로 위임합니다. 그러나 어떤 식 으로든 영향을 줄 것이라고 생각하지 않습니다. 나는 그것을 다시주고 결과로 돌아올거야. 또한 '\ n'에 대한 설명이 있습니까? 나는 그 메시지에 그 것을 포함시켜야합니까 안되나요? –

+0

당신은'\ n' 또는 다른 것을 보낼 필요가 없습니다. 서버 측의'DataInputStream.readInt()'는 4 바이트가 도착할 때까지 스레드를 차단 한 다음 그것을 4 바이트 int로 변환합니다. 따라서 대부분 서버 소켓에 4 바이트를 보내지 않습니다. 여분의 스레드를 사용하는 경우 문제의 코드에 오류가 없으므로 작동하지 않는 최소 버전을 제공 할 수 있습니다. 코드가 작동하면 직접 시도해 볼 수 있습니다. – xander

답변

0

xander 말처럼 아무것도, 전송되지 받고 있기 때문에 결코 읽는되지 않은 이유는. 그리고 실제 클라이언트 코드, 서버 코드 및 클라이언트 코드의 최소화 버전을 포함하지 않은 것은 내 잘못이었습니다.

클라이언트의 while() 루프 이후에 메시지를 보내려고했지만 (서버의 메시지도 기다립니다).

해결책은 클라이언트의 수신 부분을 다른 스레드로 위임하여 서버에 메시지를 보내는 데 필요한 주 스레드를 차단하지 못하게하는 것이 었습니다.

관련 문제