黑马程序员技术交流社区

标题: 关于Socket中出现的SocketException_connection reset [打印本页]

作者: jìng╮煜    时间: 2013-9-13 18:30
标题: 关于Socket中出现的SocketException_connection reset
首先,我说的仅代表个人意见.和个人处理方式.
        在好久前看到毕向东老师的视频的23天结尾,到24天开头,那一段讲述的是Tcp的网络编程. 我发现同样一段代码,在我这里会出现一个Excetion,跳出来的异常信息是:
Exception in thread "main" java.net.SocketException: Connection reset
        at java.net.SocketInputStream.read(SocketInputStream.java:189)
        at java.net.SocketInputStream.read(SocketInputStream.java:121)
        at java.net.SocketInputStream.read(SocketInputStream.java:107)
        at PicClient.main(TcpPic.java:42)

        很明显是个SocketException. 我就一个字一个字核对代码,  发现代码并没有错.我又不甘心,把毕向东老师亲自敲得代码给拿出来运行一下.还是会出现这个异常.这次我释然了.可能就是电脑网络不一样带来的错误.问题也被缩小到一定范围,并不是代码错误.那到底是哪里错了呢?
       
        InputStream in = s.getInputStream();
        寻找代码42行.是这句 num = in.read(buf);   这句话前后代码加起来意思就是获取服务端的返回信息."发送成功"
        这个Exception后面还有一串字符.Connection reset
        我百度了一下,发现 出现Connection reset 异常大致可能性是:
        1 客户端关闭,但服务端还在写入.
        2 服务端关闭,但客户端还在读取.
       
        我还发现执行连接后要传送的东西已经传送好了.但就是没有"传送完毕"字样.那么问题就大致明了了.  是num = in.read(buf);这句获取语句的错误!
        那么我就思考,为什么以前用BufferedReader语句就不会发生错误呢?
        查阅了API,从Socket到InputStream,再到String类中toBytes()都看了,传递参数无误.
        因时间和能力原因,无法知晓其更深的错误原因.于是把InputStream in = s.getInputStream();改成       
                BufferedWriter out =
                        new BufferedWriter(new OutputStreamWriter(sk.getOutputStream()));
                和
                PrintWriter out = new PrintWriter(s.getOutputStream());
        问题依旧.
                只不过在BufferedReader里面把写的代码flush一下就会出现问题.

                很有可能是sk.shutdownOutput(); 客户端里面的这句结束语句的问题.才导致了Exception的产生.

        希望懂的人能给一些稍简单的解释,还希望此贴能给碰到此类问题的人一些建设性的帮助.

       


作者: kmter    时间: 2013-9-14 00:52
首先非常赞赏和支持楼主对问题刨根问底的精神.
根据楼主的陈述, 我并没有找到楼主说的源代码(我没有找到毕老师在那天写的TcpPic文件, 所以还是建议楼主最好是能提交以下你出问题的所有代码, 这样有助于别人理解你的疑惑), SocketException : Connection reset 这个异常信息说明程序在尝试调用一个已经关闭的流(亦或是随着Socket对象s调用close()方法导致其IO流跟着关闭).
值得注意的是, close()方法调用之后是不可逆的, Socket与ServerSocket之间的通道也将被关闭.
以上只是我对楼主你所陈述的猜测. 而且, 楼主似乎在有句话的表达上面出现问题.

        因时间和能力原因,无法知晓其更深的错误原因.于是把InputStream in = s.getInputStream();改成        
                BufferedWriter out =
                        new BufferedWriter(new OutputStreamWriter(sk.getOutputStream()));
                和
                PrintWriter out = new PrintWriter(s.getOutputStream());
        问题依旧.
                只不过在BufferedReader里面把写的代码flush一下就会出现问题.




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2