2013-03-18 3 views
5

PrintWriter 또는 다른 출력 스트림을 사용하여 서버와 클라이언트 프로그램간에 메시지를 보내는 데 문제가 있습니다. println ("abc")을 사용하여 통신하면 제대로 작동하지만 print ("abc \ r \ n"), print ("abc \ n") 또는 print ("abc \ r"). "작동하지 않는다"는 것은 "개행"문자가 보이지 않고 "\ r"또는 "\ n"을 기다리고 있기 때문에 readLine()이 종료되지 않는다는 것입니다.PrintWriter 또는 Java의 다른 출력 스트림은 " r n"을 알지 못합니다.

클라이언트 : 그것은 더 명확, 단순히 다음과 같은 몇 가지 코드를 넣어 것입니다

import java.net.*; 
import java.io.*; 

public class Server { 
    public static void main(String[] args) throws IOException { 

    ServerSocket serverSocket = null; 
    try { 
     serverSocket = new ServerSocket(1234); 
    } catch (IOException e) { 
     System.err.println("Could not listen on port: 1234."); 
     System.exit(1); 
    } 

    Socket clientSocket = null; 
    try { 
     clientSocket = serverSocket.accept(); 
    } catch (IOException e) { 
     System.err.println("Accept failed."); 
    } 
    System.out.println("Connected"); 


    PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true); 
    BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); 

    String textFromClient; 
    textFromClient = in.readLine(); // read the text from client 
    System.out.println(textFromClient); 


    String textToClient = "Recieved"; 
    out.print(textToClient + "\r\n"); // send the response to client 

    out.close(); 
    in.close(); 
    clientSocket.close(); 
    serverSocket.close(); 
    } 
} 

[서버 :

import java.net.*; 
import java.io.*; 

public class Client { 
public static void main(String[] args) throws IOException { 

    Socket socket = null; 
    PrintWriter out = null; 
    BufferedReader in = null; 
    BufferedReader read = new BufferedReader(new InputStreamReader(System.in)); 

    try { 
     socket = new Socket("localhost", 1234); 
     out = new PrintWriter(socket.getOutputStream(), true); 
     in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
    } catch (UnknownHostException e) { 
     System.err.println("Don't know about host"); 
    } catch (IOException e) { 
     System.err.println("Couldn't get I/O for the connection"); 
    } 
    System.out.println("Connected"); 

    String textToServer; 

    textToServer=read.readLine(); 
    out.print(textToServer + "\r\n"); // send to server 

    System.out.println(in.readLine()); // read from server 

    out.close(); 
    in.close(); 
    read.close(); 
    socket.close(); 
    } 
} 

I 인쇄() + "\ 연구 \ n"대신를 사용하려면를 내가 쓰고있는 서버 프로그램은 서버에서 클라이언트로 보내는 메시지가 필요하다는 이유로 println()의 끝에 "\ r \ n"을 포함하십시오. "이것은 서버에서 클라이언트로 보내는 메시지입니다 \ r \ n". println()은 print ("\ r \ n")와 같기 때문에 println() + "\ r \ n"을 사용해야한다고 생각하지 않습니다. 그렇지 않으면 2 개의 개행 문자가 생깁니다. (비록 클라이언트 측에서 서버 프로그램을 작성하라는 요청을 받았기 때문에 클라이언트 측이 서버에서 읽는 방법을 모르지만 서버 프로그램을 테스트하기 위해 클라이언트 측을 작성합니다.) 그러나 " r \ n "을 읽지 만 readLine()은 그것을 인식하지 못하는 것처럼 보입니다. 그럼 내가 어떻게 할 수 있니?

내 질문을 이해하지 못한다면 위의 코드를 시도해 볼 수 있으며 내 뜻을 알 수 있습니다.

답변

10

플러시()는 클라이언트에서 서버로 쓰기 후 :

out.print(textToServer + "\r\n"); // send to server 
out.flush(); // here, it should get you going. 

그것은했다.

VishalD의 대답의 상단에
+2

놀랍습니다! 나는 정말로 flush()가 그것이 작동하도록 만드는 이유를 정말로 모른다. 나는 또한 PrintWriter out = new PrintWriter (clientSocket.getOutputStream(), true)를 발견했다. 오직 println()을 자동으로 플러시하지만 print()는하지 못하게하십시오. 그래서 println()은 예상대로 작동하지만 print()는 작동하지 않습니다. 고맙습니다 !! – Joey

2

, println()를 사용하거나 readline() 어쨌든 \n 찾기 때문 \r\n로 전송에 대해 걱정할 필요가 없습니다. API :

텍스트 줄을 읽습니다. 한 줄은 줄 바꿈 ('\ n'), 캐리지 리턴 ('\ r') 또는 캐리지 리턴 다음에 바로 줄 바꿈으로 끝나는 것으로 간주됩니다.