首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Java套接字中关闭流的适当方法

在Java套接字中关闭流的适当方法
EN

Stack Overflow用户
提问于 2013-07-11 04:12:26
回答 2查看 3K关注 0票数 0

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

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

代码语言:javascript
复制
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();
    }
}

这是客户端:

代码语言:javascript
复制
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.shutdownInputSocket.shutdownOutput来克服这一问题。不过,我仍在想,这是否是正确的做法?

需要注意的是,当服务器写入响应或客户端读取时使用close()关闭流不会造成问题(我猜结束时客户端和服务器之间是同步的)。

所以我的问题是:

  1. 使用套接字关闭方法是正确的方法吗?
  2. 我是否可以继续用close()关闭最后的流(当从服务器发送和读取响应时)
  3. 是否会发生关闭时关闭时会将一些数据保存在缓冲区中而不会被发送的情况呢?
EN

回答 2

Stack Overflow用户

发布于 2013-07-11 04:17:36

您可以执行以下操作:

代码语言:javascript
复制
try{
}catch(){
}finally{
if(is!=null){
is.close();
}
if(os!=null){
os.close();
}
}
票数 1
EN

Stack Overflow用户

发布于 2013-07-11 04:53:34

这段代码的问题是客户机中的OutputStream.close()和服务器中的InputStream.close()。正如Javadocs中所述,关闭流将关闭套接字。

正确,但服务器中的InputStream不是直接连接到Socket:,而是连接到您不知道的东西上。你可以不受惩罚地关闭它,尽管你完全不需要关闭它。如果您愿意,可以关闭服务器中的OutputStream:尽管如此,由于它没有直接连接到Socket,,所以除了冲洗之外,它可能也可能没有任何效果。

为了解决您的实际问题,您不需要关闭客户机中的输出流,但是您确实需要发送一个适当的内容长度:头。这样,服务器就知道从客户端读取多少数据。如果这只是一个GET请求,那么内容长度很可能为零。您不需要调用shutdownOutput(),,尽管我想没有什么可以阻止您,而且调用shutdownInput()也不会对网络造成任何影响,所以这也是没有意义的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17584927

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档