2014-02-26 1 views
1

클라이언트/서버 응용 프로그램을 구축 중이며 PrintWriter를 사용하여 서버 스레드에서 클라이언트로 String을 보내려고합니다. 나는이처럼 내 PrintWriter를 구성 :PrintWriter 만 println과 함께 문자열을 보내고 인쇄하지 않습니다.

BufferedReader in = new BufferedReader(new InputStreamReader(client.server.getInputStream())); 

및 클라이언트에서 메시지를 가져옵니다

// Instantiate a PrintWriterwith a correctly implemented 
// client socket parameter, and autoflush set to true 
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true); 

, 클라이언트가의 BufferedReader로 입력 스트림에서 읽고 있다는 것을이 같은 인스턴스화, 더, 가정 다음과 같은 서버 :

String serverMessage = in.readLine(); 

자세히 알 수 있듯이 autoflushing을 true로 설정했습니다. 이제는 클라이언트에게 간단한 메시지를 보내려고합니다. 나는 문을 실행할 경우

out.println("Message to client");

그런 다음 메시지가 성공적으로 전송됩니다. 그러나 문을 실행하면

out.print("Message to client"); 

메시지가 전송되지 않습니다. 또한 :

out.print("Message to client"); 
out.flush(); 

도 작동하지 않습니다.

이것은 터미널의 클라이언트에게 메시지를 보내고 동일한 줄에서 응답 할 수 있어야하기 때문에 문제가됩니다. PrintWriter를 사용하여 플러시/클라이언트로 보내지지만 줄 바꿈 문자를 보내지 않도록 메시지를 보내는 방법은 무엇입니까?

+0

클라이언트가 스트림을 어떻게 읽습니까? –

+0

클라이언트가 BufferedReader로 스트림을 읽습니다. 인스턴스화를 질문에 넣을 것입니다. – DIMMSum

+2

'BufferedReader # readLine()'을 사용하고 있다면 줄 바꿈 문자가 필요합니다. –

답변

1

당신의 경우에는 BufferedReader#readLine()을 사용하고있는 중일 때 개행 문자 나 스트림의 끝에 도달 할 때까지 문자를 읽는 것 같습니다. 따라서 새로운 라인 문자를 작성하려면 서버가 필요합니다.

대체 방법은 BufferedReader#readLine() 대신에 바이트를 직접 읽는 것입니다.

왜 캐리지 리턴 작업을 사용하지 않습니까?

개행 문자는 시스템에 따라 다릅니다. Windows에서는 \r\n입니다. 리눅스에서는 \n입니다.

System.getProperty("line.separator") 

으로 얻을 수 있지만 서버를 가져와야합니다.

+0

감사합니다. 그것은 매우 계몽적이고 도움이되었습니다! – DIMMSum

+0

@Decave 환영합니다. –

관련 문제