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(); 
    } 
} 

私は印刷()+ "\ rを\ n" は代わりを使用したいが私が書いているサーバプログラムは、サーバからクライアントに送られるメッセージが、最後に "\ r \ n"が含まれています。 "これはサーバーからクライアントへのメッセージです\ r \ n"。 println()はprint( "\ r \ n")と同じだと思うので、println()+ "\ r \ n"を使うべきではないと思います。 (私はサーバプログラムだけを書くように求められているので、クライアント側がサーバからどのように読み込むのかはわかりませんが、サーバプログラムをテストするためにクライアント側に書きます)。しかし、 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 =新しいPrintWriter(clientSocket.getOutputStream()、true)が見つかりました。 println()を自動でフラッシュしますが、print()は行いません。そのため、println()は期待どおりに動作しますが、print()では動作しません。ありがとうございました !! – Joey

2

println()を使用するか、またはreadline()はとにかく\nを探すため\r\nで送信心配する必要はありません。 API

テキストの行を読み取ります。行は、改行( '\ n')、復帰( '\ r')、改行の直後に続く改行のいずれかで終了すると見なされます。

関連する問題