2012-02-18 2 views
2

버퍼에서 문자열을 읽고 서버에 쓰고 있습니다. 내가 가지고있는 문제는 소켓을 열어두고 루프를 쓸 때 문자열이 서버에 수신되지 않는다는 것입니다. 나는이 사용하는 경우 :writeBytes를 사용하는 Java 클라이언트 소켓

try {  
     Socket send = new Socket("localhost", 1490); 
     DataOutputStream out = new DataOutputStream(send.getOutputStream()); 
     String message = null; 
     while ((message = buffer.get()) != null){ 
      out.writeBytes(message); 
     } 
     out.close(); 
     send.close(); 
    } catch (IOException ex) { 
     ex.printStackTrace(); 
    } 
} 

서버가 문자열을받지 않습니다,하지만 난이 작업을 수행 할 때 제대로 작동 : 분명히

try {  

     String message = null; 
     while ((message = buffer.get()) != null){ 
      Socket send = new Socket("localhost", 1490); 
      DataOutputStream out = new DataOutputStream(send.getOutputStream()); 
        out.writeBytes(message); 
      out.close(); 
      send.close(); 
     } 

    } catch (IOException ex) { 
     ex.printStackTrace(); 
    } 
} 

나는 개방과 폐쇄를 유지하지 않으을 소켓. 문제가 무엇입니까?

답변

0

데이터를 닫을 때도 소켓에 데이터가 쓰여지고 있지 않습니까? (귀하의 첫 번째 발췌 문장에)

또한 플러시 방법을 사용해 보셨습니까? 당신은 여기에 대해 읽을 수 있습니다 : http://docs.oracle.com/javase/1.4.2/docs/api/java/io/DataOutputStream.html#flush()와 같은 코드가 보일 것이다 : 당신은 당신의 소켓은 데이터 패킷을 보낼 때마다 세척 할 필요가

try {  
    Socket send = new Socket("localhost", 1490); 
    DataOutputStream out = new DataOutputStream(send.getOutputStream()); 
    String message = null; 
    while ((message = buffer.get()) != null){ 
     out.writeBytes(message); 
     out.flush(); 
    } 
    out.close(); 
    send.close(); 
} catch (IOException ex) { 
    ex.printStackTrace(); 
} 
+0

예, 플러시를 시도했지만 여전히 동일한 문제가 있습니다. 버퍼에는 항상 문자열이 있으므로 소켓이 실제로 닫히지 않는다고 생각합니다. 그런데도 내 메시지가 아직받지 못하는 이유는 무엇입니까? – user1190650

1

. 소켓을 닫으면 자동 플러시가 강제로 이루어지며 소켓 닫기에서 데이터가 전송되는 이유가 설명됩니다.

0

내가 추측 해 봅시다.

buffer.get() 메서드 블록이 차단됩니까? 그렇다면 out.writeBytes(message)이 전체 바이트 표현을 서버에 푸시한다고 보장 할 수 없다는 문제점이 있습니다. 대신. 클라이언트가 서버로 플러시되기를 기다리는 버퍼 된 바이트가있을 가능성이 있습니다.

이것이 계속되는 경우 writeBytes을 호출 할 때마다 flush를 호출하면 문제가 해결됩니다.

그러나 buffer.get() 메서드가 차단되지 않으면 flush를 호출해도 아무런 차이가 없습니다. 사실, 그것은 단지 네트워크 트래픽을 증가시킬 것입니다. 따라서 "just in case"플러시를 추가하는 것은 나쁜 생각입니다.


또 다른 가능성은 서버 측 코드에 문제가 있다는 것입니다.

+0

감사합니다. 예, buffer.get()은 블록을 처리하지만 writeBytes를 호출 할 때마다 버퍼를 플러시하려고했지만 여전히 동일한 문제가 있습니다. 다른 아이디어? – user1190650

+0

제 답변의 마지막 문장을 다시 읽으십시오. –