0

我看到了一些关于这个的帖子,但我仍然找不到答案。

这是我的服务器与客户端交互的方式:

public void run () {
    try {
        //Read client request
        InputStream is = server.getInputStream();
        byte[] buff = new byte[1024];
        int i;
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        while ((i = is.read(buff, 0, buff.length)) != -1) {
            bos.write(buff, 0, i);
            System.out.println(i + " bytes readed ("+bos.size()+")");
        }
        is.close();
        is = null;
        //Do something with client request

        //write response
        OutputStream os = server.getOutputStream();
        os.write("server response".getBytes());
        os.flush();
        os.close();
        os = null;

    } catch (IOException ioe) {
        ioe.printStackTrace();
    }
}

这是客户端:

public void run() {
        try {
            InetAddress serverAddr = null;
            serverAddr = InetAddress.getByName("10.0.2.2");
            socket = new Socket(serverAddr, 5000);

            //Send Request to the server
            OutputStream os = socket.getOutputStream();
            os.write(jsonRequest.toString().getBytes("UTF-8"));
            os.flush();
            os.close();
            os = null;

            //Read Server Response
            InputStream is = socket.getInputStream();
            byte[] buff = new byte[1024];
            int i;
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            while ((i = is.read(buff, 0, buff.length)) != -1) {
                bos.write(buff, 0, i);
                System.out.println(i + " bytes readed ("+bos.size()+")");
            }
            is.close();
            is = null;

            //Do something with server response

        } catch (UnknownHostException uhe) {
            sendCallbackError(uhe);
        } catch (IOException ioe) {
            sendCallbackError(ioe);
        }
    }

如您所见,客户端连接并发送请求。服务器读取该请求,然后写入客户端将读取的响应。

此代码的问题OutputStream.close()在于客户端和InputStream.close()服务器中。如 Javadocs 中所述,关闭流将关闭Socket. 结果是当客户端尝试读取服务器响应时,Socket已经关闭。

我已经设法通过调用Socket.shutdownInputand来克服这个问题Socket.shutdownOutput。但是我仍在考虑这是否是正确的做法

请注意,在服务器写入响应或客户端读取响应时关闭流close()不会产生问题(我猜客户端和服务器之间的关闭是同步的)。

所以我的问题是:

  1. 使用 Socket 关闭方法是否正确?
  2. 我可以继续关闭最后一个流吗close()(从服务器发送和读取响应时)
  3. 关闭时关闭是否会在缓冲区中保留一些数据并且不会被发送?
4

2 回答 2

1

您可以执行以下操作:

try{
}catch(){
}finally{
if(is!=null){
is.close();
}
if(os!=null){
os.close();
}
}
于 2013-07-11T04:17:36.513 回答
0

此代码的问题是客户端中的 OutputStream.close() 和服务器中的 InputStream.close()。如 Javadocs 中所述,关闭流将关闭 Socket。

正确,但InputStream服务器中的 没有直接连接到Socket:它连接到您一无所知的东西。您可以不受惩罚地关闭它,尽管您根本不需要关闭它。OutputStream如果您愿意,您可以关闭服务器Socket,中的

要解决您的实际问题,您无需关闭客户端中的输出流,但您需要发送适当的 Content-Length: 标头。这样服务器就知道要从客户端读取多少。如果这只是一个 GET 请求,则内容长度很可能为零。你不需要打电话,shutdownOutput(),虽然我想没有什么可以阻止你,而且打电话shutdownInput()对网络没有任何作用,所以再一次没有意义。

于 2013-07-11T04:53:34.823 回答