0

サーバーにメッセージを送信し、その後応答を受信する必要がある Java クライアント アプリケーションを構築しています。メッセージを正常に送信できます。問題は、「BufferedReader」を読み取ろうとすると IO 例外 (「Socked is closed」) が発生するため、応答を取得できないことです。

これまでのところ、これは私のコードです:

public class MyClass {

    /**
     * @param args the command line arguments
     */
    @SuppressWarnings("empty-statement")
    public static void main(String[] args) {
        JSONObject j = new JSONObject();
        try {
            j.put("comando", 1);
            j.put("versao", 1);
            j.put("senha", "c4ca4238a0b923820dcc509a6f75849b");
            j.put("usuario", "1");
            j.put("deviceId", "1");

        } catch (JSONException ex) {
            System.out.println("JSON Exception reached");
        }

        String LoginString = "{comando':1,'versao':1,'senha':'c4ca4238a0b923820dcc509a6f75849b','usuario':'1','deviceId':'1'}";
        try {
            BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in));

            Socket clientSocket = new Socket("10.1.1.12", 3333);
            System.out.println("Connected to the server successfully");
            PrintWriter outToServer = new PrintWriter(clientSocket.getOutputStream(),true);

            outToServer.println(j.toString());
            outToServer.close();
            System.out.println("TO SERVER: " + j.toString());

            BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));

            String resposta = inFromServer.readLine();
            System.out.println("FROM SERVER: " + resposta);

            clientSocket.close();
        } catch (UnknownHostException ex) {
            System.out.println("Could not connect to the server [Unknown exception]");
        } catch (IOException ex) {
            System.out.println(ex.getMessage());
        } 
    }
}

OutToServer.close()のためにソケットが閉じられていることはわかっていますが、ストリームを閉じることがメッセージを送信する唯一の方法です。この状況にどのようにアプローチすればよいですか?

4

2 に答える 2

2

flush()付属の場合はその限りではありませんnew PrintWriter(, true)

本当の問題は、元のPrintWriter outToServerをラップするを閉じInputStreamていることですSocket

を閉じると、outToServerソケット全体が閉じられます。

Socket#shutdownOutput()を使用する必要があります。

今後の通信のためにソケットの入出力チャネルを保持したい場合は、出力を閉じる必要さえありません。

  1. flush()あなたが終わったらwriteXXX。これらはwriteXXX実際には、それらのバイトと文字をソケットの反対側に送信したという意味ではありません。

  2. 送信する必要があるすべてを送信したことをサーバーに通知するために、出力を閉じて出力のみを閉じる必要がある場合があります。これは実際にはサーバー側ソケットの要求の問題です。

final Socket socket = new Socket(...);
try {
    final PrintStream out = new PrintStream(socket.getOutputStream());
    // write here
    out.flush(); // this is important.
    socket.shutdownOutput(); // half closing

    // socket is still alive

    // read input here

} finally {
    socket.close();
}
于 2013-01-14T15:32:31.150 に答える
1

電話してみるoutToServer.flush()

これはバッファからデータをフラッシュしようとしますが、送信されることは保証されません。

于 2013-01-14T15:20:05.530 に答える