6

PrintWriter またはその他の出力ストリームを使用してサーバーとクライアント プログラム間でメッセージを送信するのに問題があります。println("abc") を使用して通信すると正しく動作しますが、print("abc\r\n")、print("abc\n") または print("abc\r") を使用すると動作しません。 )。「機能しない」とは、「改行」文字が表示されないようで、まだ「\ r」または「\ n」を待っているため、readLine()が終了しないことを意味します

より明確にするために、いくつかのコードを次のコードに入れます。 クライアント:

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」を含める必要があるため、println() の代わりに print() + "\r\n" を使用したいのですが、例えば。"これはサーバーからクライアントへのメッセージです\r\n". println() は print("\r\n") と同じだと思うので、println() + "\r\n" を使うべきではないと思います。(ただし、サーバー プログラムのみを作成するように求められているため、クライアント側がサーバーからどのように読み取るかはわかりません。サーバー プログラムをテストするためにクライアント側を作成します。) ただし、「\」を含むメッセージを送信することになっています。最後に r\n" ですが、 readLine() はそれを認識していないようです。それで、私はそれで何ができますか?

私の質問が理解できない場合は、上記のコードを試してみてください。意味がわかります。

4

2 に答える 2

14

flush()次のように、クライアントからサーバーに書き込んだ後に呼び出します。

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

flush():出力ストリームをフラッシュし、バッファリングされた出力バイトを強制的に書き出します。

于 2013-03-18T15:00:53.430 に答える
2

VishalD の回答に加えて、とにかく検索するため、使用println()または送信について心配する必要はありません。APIから:\r\nreadline()\n

1 行のテキストを読み取ります。行は、ライン フィード ('\n')、キャリッジ リターン ('\r')、またはキャリッジ リターンの直後のラインフィードのいずれかによって終了すると見なされます。

于 2013-03-18T15:05:33.403 に答える