2014-06-21 2 views
1

클라이언트에서 서버로 문자열을 보내려고하지만 입력 스트림에서 읽지 않는 것 같습니다.IOUtils 복사 및 쓰기 문제

클라이언트

Scanner scanner = new Scanner(System.in); 
Socket connection = new Socket("localhost", 13) 
OutputStream out = connection.getOutputStream(); 

while(true) { 
    String message = scanner.nextLine(); 
    IOUtils.write(message, out, "UTF-8"); 
    out.flush(); 
} 

서버 나 클라이언트의 OutputStream로부터 스트림을 닫습니다하지만 클라이언트에서 서버로 여러 개의 메시지를 보내려고하고 경우 읽기

ServerSocket server = new ServerSocket(localhost,13);~ 
Socket connection = server.accept(); 
InputStream in = connection.getInputStream(); 
StringWriter writer = new StringWriter(); 

while(true) { 
    try { 
     IOUtils.copy(in, writer); 
     System.out.println(writer.toString()); 
    } catch(IOException io) {} 
} 

. 누군가 도와 주시겠습니까

답변

2

당신은 클라이언트 쪽에서 flush()를 호출 할 때마다 서버가이를 알게되고 이것이 메시지의 끝임을 알 수 있습니다. 그건 사실이 아니야. IOUtils.copy()은 바이트 스트림에서 모든 것을 읽습니다. 스트림 끝에 도달하지 않은 동안 copy()이 반환되지 않습니다.

긴 튜브의 두면으로 스트림을 볼 수 있습니다. 튜브 끝 부분에 10 개의 버킷 물을 부으면 반대쪽에있는 모든 물은 연속적으로 흐릅니다.

여러 개의 개별 메시지가 필요한 경우 메시지를 분리 할 수있는 프로토콜을 디자인하고 메시지 끝에 도달 할 때까지 읽어야합니다. 구분자를 기반으로 할 수 있습니다. 또는 다음 메시지를 받기 위해 읽어야하는 바이트 수를 서버에 알려주기 위해 메시지 길이 뒤에 메시지 길이를 보낼 수 있습니다.

+1

OP는 각 줄이 메시지 인 줄을 보내려고합니다. 프로토콜은 간단합니다. 클라이언트 측에서 PrintWriter의 println 메소드를 사용하여 라인을 작성하고 서버 측에서 BufferedReader의 readLine() 메소드를 사용하여 라인을 읽습니다. 이 경우 메시지의 끝은 작성자가 보낸 EOL이며 readLine() 메소드로 감지됩니다. 너 혼자 알아 내야 해. 그것이 당신이 배우는 방법입니다. –

+0

대답했습니다. 나는 그것을 시도해 주겠다, 감사한다 – zam

+0

방금 ​​설명하는 위의 코멘트를 업데이트했다. –