A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© boboyuwu 高级黑马   /  2015-10-17 10:57  /  3866 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

5黑马币
try {                       
            System.out.println(3);
            oos=new ObjectOutputStream(client.getOutputStream());
            sperson sp=new sperson();
            System.out.println(4);
            sp.setName("aaaaaaaaaaaaaaaa");
            oos.writeObject(sp);
            oos.flush(); }
            catch (IOException e) {
            System.out.println("客户端错误2"+e.getMessage());}        


为什么不关闭oos就会报出异常   connect reset加上这个才能正常发送出去
       /* finally{
                         try{
                                 if(oos!=null)
                                         oos.close();
                         }
                         catch(IOException ex){
                                 
                         }}*/

9 个回复

倒序浏览
rzx 中级黑马 2015-10-18 23:52:38
沙发
好    难
回复 使用道具 举报
该异常在客户端和服务器端均有可能发生,引起该异常的原因有两个:
第一个就是如果一端的Socket被关闭(或主动关闭或者因为异常退出而引起的关闭),另一端仍发送数据,发送的第一个数据包引发该异常(Connect reset by peer)。
另一个是一端退出,但退出时并未关闭该连接,另一端如果在从连接中读数据则抛出该异常(Connection reset)。简单的说就是在连接断开后的读和写操作引起的。
回复 使用道具 举报
如果不调用close方法关闭,首先占用的硬件资源被浪费,其次数据可能无法像预期的那样正确输出到文件,可能出现空白文件或者数据输出不完整的情况。此外,由于文件对象未关闭,你仍然可能对它进行操作,误操作的话会给调试惹不少麻烦,也有可能成为一种不安全因素。  一般和file的读取后需要关闭一样的道理,清理缓存的作用,还有不浪费资源的作用。
回复 使用道具 举报
首先要知道为什么要弄清几个东西
第一   ObjectOutputStream   干什么用的   ?它是将一个对象写入文件中,可能代码里并没有看到文件 但是,如果要使用这个方法 sperson sp=new sperson();  你这个类必须实现 Serializable 接口,Serializable是什么呢?序列化接口,其实就是将一些东西暂存为文件。
然后,既然是写一个文件 ,虽然你前面flush 了,但是,程序不能确定文件就写完了,可以想象,它可能有个FileOutPutStream 类似的东西,文件流没有 close  那么也就不会去发送,所以,只有当你把文件close 了,才认为你之前的已经一切准备就绪了,那么可以把这个序列化的东西发送出去了      

一些是个人猜测,但是应该是这样的
回复 使用道具 举报
oh,,,,,,,,
回复 使用道具 举报
oos=new ObjectOutputStream(client.getOutputStream());
因为oos封装的是一个OutputStream对象如果不关闭则服务端就一直在等待客户端的输入
除非你写上shutDownOutput();
回复 使用道具 举报
首先流用完以后关闭时避免资源浪费,你要知道java中流是一种很昂贵的资源,这个楼上都讲了。
再一个你这个贴个半拉子的程序出来让别人也不太好回答。Connection reset错误不是出在流未关闭上。
回复 使用道具 举报
dou都是大神  大神,,,,,  你得关掉,会浪费资源,并出错。那个flush是刷新功能。你不刷新他就一直缓存着,不会输出不会啥的  就一直运行。不过直接用一个close就行 flush不用也可以
回复 使用道具 举报
感觉好难啊   个人觉得应该资源用过后都要关闭吗  不然会占用空间
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马