如何在保持输入流打开以获得结果的同时关闭Java套接字的输出流?

Ali*_*aka 1 java sockets inputstream outputstream tcpsocket

我正在向正确传递的服务器发送消息.

但是,当试图读取结果时,我得到一个例外Socket is closed.

知道如何关闭套接字的输出流同时保持套接字和套接字的输入流打开以获得结果吗?

客户代码:

Socket socket = new Socket("localhost", 9090);
String message = "Some message";
new OutputStreamWriter(socket.getOutputStream(), Charsets.UTF_8)
        .append(message)
        .close();
// The following line throws the exception when socket.getInputStream() is called:
String fromServer = CharStreams.toString(new InputStreamReader(socket.getInputStream(), Charsets.UTF_8));
Run Code Online (Sandbox Code Playgroud)

例外:

java.net.SocketException: Socket is closed

    at java.net.Socket.getInputStream(Socket.java:903)
    at alik.server.test.Client.pingServer(Client.java:24)
Run Code Online (Sandbox Code Playgroud)

Mar*_*eel 8

来自javadocSocket.getOutputStream():

关闭返回的OutputStream将关闭相关的套接字.

换句话说,在完成输入流之前,请不要关闭输出流.关闭输入流也将关闭套接字(因此也会关闭输出流).

您可以使用Socket.shutdownOutput()以防止进一步写入套接字,但我真的没有看到使用它的意义,它可能导致对等体提前关闭其套接字,正如Stephen C在评论中解释的那样:

只有在读取时,对等体才应该看到封闭的流.接下来会发生什么取决于它如何响应看到封闭的流.