0

我正在构建一个需要向服务器发送消息并随后接收响应的 Java 客户端应用程序。我可以成功发送消息,问题是我无法获得响应,因为我在尝试读取 'BufferedReader' 时遇到 IO 异常(“Socked 已关闭”)。

这是我的代码,到目前为止:

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 回答