首先,我说的仅代表个人意见.和个人处理方式.
在好久前看到毕向东老师的视频的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的产生.
希望懂的人能给一些稍简单的解释,还希望此贴能给碰到此类问题的人一些建设性的帮助.
|