java.net.SocketException:Software caused connection abort: recv failed 异常分析 +socket客户端&服务端代码

java.net.SocketException:Software caused connection abort: recv failed 异常分析

分类: 很多的技术 2012-01-04 12:54 8004人阅读 评论(6) 收藏 举报

socket服务器bufferstring网络java



1个异常是java.net.BindException:Address already in use:
JVM_Bind。该异常发生在服务器端进行new
ServerSocket(port)(port是一个0,65536的整型值)操作时。异常的原因是以为与port一样的一个端口已经被启动,并进行监
听。此时用netstat
–an命令,可以看到一个Listending状态的端口。只需要找一个没有被占用的端口就能解决这个问题。


2个异常是java.net.ConnectException: Connection refused:
connect。该异常发生在客户端进行new Socket(ip,
port)操作时,该异常发生的原因是或者具有ip地址的机器不能找到(也就是说从当前机器不存在到指定ip路由),或者是该ip存在,但找不到指定的端
口进行监听。出现该问题,首先检查客户端的ip和port是否写错了,如果正确则从客户端ping一下服务器看是否能ping通,如果能ping通(服务
服务器端把ping禁掉则需要另外的办法),则看在服务器端的监听指定端口的程序是否启动,这个肯定能解决这个问题。

第3个异常是java.net.SocketException: Socket is closed,该异常在客户端和服务器均可能发生。异常的原因是己方主动关闭了连接后(调用了Socket的close方法)再对网络连接进行读写操作。


4个异常是java.net.SocketException: (Connection reset或者Connect reset by
peer:Socket write
error)。该异常在客户端和服务器端均有可能发生,引起该异常的原因有两个,第一个就是如果一端的Socket被关闭(或主动关闭或者因为异常退出而
引起的关闭),另一端仍发送数据,发送的第一个数据包引发该异常(Connect
reset by peer)。另一个是一端退出,但退出时并未关闭该连接,另一端如果在从连接中读数据则抛出该异常(Connection
reset)。简单的说就是在连接断开后的读和写操作引起的。


5个异常是java.net.SocketException: Broken
pipe。该异常在客户端和服务器均有可能发生。在第4个异常的第一种情况中(也就是抛出SocketExcepton:Connect reset
by peer:Socket write
error后),如果再继续写数据则抛出该异常。前两个异常的解决方法是首先确保程序退出前关闭所有的网络连接,其次是要检测对方的关闭连接操作,发现对
方关闭连接后自己也要关闭该连接。


java.net.SocketException: Connection reset 问题解决方法 
客户端用长连接进行连接,也就是写个死循环,while ture;用 
while((temp = inputStream.read(buffer)) != -1){ 
System.out.println(new String(buffer,0,temp)); 

会报java.net.SocketException: Connection reset 异常

----------》服务端

Java代码

  1. import java.io.IOException;
  2. import java.io.InputStream;
  3. import java.net.ServerSocket;
  4. import java.net.Socket;
  5. public class ServerDemo {
  6. public static void main(String[] args) {
  7. new ServerThread().start();
  8. }
  9. }
  10. class ServerThread extends Thread{
  11. public void run(){
  12. //声明一个ServerSocket对象
  13. ServerSocket serverSocket = null;
  14. try {
  15. //创建一个ServerSocket对象,并让这个Socket在4567端口监听
  16. serverSocket = new ServerSocket(4568);
  17. byte buffer [] = new byte[1024*4];
  18. int temp = 0;
  19. //从InputStream当中读取客户端所发送的数据
  20. while(true){
  21. //调用ServerSocket的accept()方法,接受客户端所发送的请求
  22. Socket socket = serverSocket.accept();
  23. //从Socket当中得到InputStream对象
  24. InputStream inputStream = socket.getInputStream();
  25. temp = inputStream.read(buffer);
  26. System.out.println(new String(buffer,0,temp));
  27. }
  28. } catch (IOException e) {
  29. // TODO Auto-generated catch block
  30. e.printStackTrace();
  31. }
  32. finally{
  33. try {
  34. serverSocket.close();
  35. } catch (IOException e) {
  36. // TODO Auto-generated catch block
  37. e.printStackTrace();
  38. }
  39. }
  40. }
  41. /*      public void run(){
  42. try {
  43. //创建一个DatagramSocket对象,并指定监听的端口号
  44. DatagramSocket socket = new DatagramSocket(4567);
  45. byte data [] = new byte[1024];
  46. //创建一个空的DatagramPacket对象
  47. DatagramPacket packet = new DatagramPacket(data,data.length);
  48. //使用receive方法接收客户端所发送的数据
  49. socket.receive(packet);
  50. String result = new String(packet.getData(),packet.getOffset(),packet.getLength());
  51. System.out.println("result--->" + result);
  52. } catch (Exception e) {
  53. // TODO Auto-generated catch block
  54. e.printStackTrace();
  55. }
  56. }*/
  57. }

-----------》客户端

Java代码

  1. import java.io.FileInputStream;
  2. import java.io.InputStream;
  3. import java.io.OutputStream;
  4. import java.io.OutputStreamWriter;
  5. import java.io.Writer;
  6. import java.net.Socket;
  7. public class TCPClient {
  8. public static void main(String[] args) {
  9. try {
  10. //创建一个Socket对象,指定服务器端的IP地址和端口号
  11. Socket socket = new Socket("192.168.1.103",4568);
  12. //使用InputStream读取硬盘上的文件
  13. InputStream inputStream = new FileInputStream("C://Documents and Settings/Administrator/桌面/临时备份/fileTest/1.txt");
  14. //从Socket当中得到OutputStream
  15. OutputStream outputStream = socket.getOutputStream();
  16. byte buffer [] = new byte[4*1024];
  17. int temp = 0 ;
  18. //将InputStream当中的数据取出,并写入到OutputStream当中
  19. while((temp = inputStream.read(buffer)) != -1){
  20. outputStream.write(buffer, 0, temp);
  21. }
  22. outputStream.flush();
  23. } catch (Exception e) {
  24. // TODO Auto-generated catch block
  25. e.printStackTrace();
  26. }
  27. }
  28. }


java.net.SocketException: Software caused connection abort: recvfailed

at java.net.SocketInputStream.socketRead0(Native Method)

at java.net.SocketInputStream.read(SocketInputStream.java:129)

at java.net.SocketInputStream.read(SocketInputStream.java:182)

发生这个异常,从异常提示看是由于程序引起的,而非网络方面的原因,引发该异常的

场景之一:

客户机<-->服务器,之间是由一个socket长连接来通信,客户端有一个接收线程在while(true){..}循环里不停地从InputStream流中读数据,客户机每隔几秒钟发一次心跳包至服务端,如果连续未收到心跳包响应的次数已达到规定的次数,客户机认为此链路异常,将socket关闭,那么服务器会抛出java.net.SocketException:Connection
reset by peer异常,然后分配给此socket连接的线程退出,那么客户端在while(true){..}循环,读取流时便会发java.net.SocketException: Software
causedconnection abort: recv failed异常。

时间: 2024-10-10 05:51:33

java.net.SocketException:Software caused connection abort: recv failed 异常分析 +socket客户端&服务端代码的相关文章

FTP上传文件,报错java.net.SocketException: Software caused connection abort: recv failed

FTP上传功能,使用之前写的代码,一直上传都没有问题,今天突然报这个错误: java.net.SocketException: Software caused connection abort: recv failed at java.net.SocketInputStream.socketRead0(Native Method) at java.net.SocketInputStream.read(SocketInputStream.java:152) at java.net.SocketIn

错误:Caused by: java.net.SocketException: Software caused connection abort: recv failed

使用Spring JDBC时遇到的Software caused connection abort: recv failed问题 org.springframework.dao.DataAccessResourceFailureException: PreparedStatementCallback; SQL [select t.f_role_id from db_sys_user_role t where t.f_user_id=?]; Communications link failure

Software caused connection abort: recv failed错误

java.net.SocketException: Software caused connection abort: recv failed    at java.net.SocketInputStream.socketRead0(Native Method)    at java.net.SocketInputStream.read(Unknown Source)    at java.net.SocketInputStream.read(Unknown Source)    at org.

ClientAbortException: java.net.SocketException: Software caused connection abort: socket write erro

1.错误描述 ClientAbortException: java.net.SocketException: Software caused connection abort: socket write error at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:407) at org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteCh

Caused by: java.net.SocketException: Software caused connection abort: socket write error

1.错误描述 [ERROR:]2015-10-16 22:28:39,964 [异常拦截] exception.ExceptionHandler ClientAbortException: java.net.SocketException: Software caused connection abort: socket write error at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.ja

eclipse的TestNG报错java.net.SocketException: Software caused connection abort: socket write error&quot;

最近整了一个自动化项目,需要用到testng,安装的最新版本6.11.0老是提示错误java.net.SocketException: Software caused connection abort: socket write error" 百度了半天终于解决了,具体方法如下: 1,卸载eclipse中原安装的6.11.0版本 2,安装指定的版本6.8.22: 输入指定的版本地址安装.http://beust.com/eclipse-old/eclipse_6.8.22.20150507032

testNG java.net.SocketException: Software caused connection abort: socket write error

执行用例报错,提示 java.net.SocketException: Software caused connection abort: socket write error java.net.SocketException: Software caused connection abort: socket write error at java.net.SocketOutputStream.socketWrite0(Native Method) at java.net.SocketOutpu

开发:异常收集之 Software caused connection abort: recv failed

近期用ibatis比较多,中间也遇到很多奇葩小问题,但是也纠结我特别久.遂记录下来: 其中一个:java.sql.SQLException: Io 异常: Software caused connection abort: recv failed 这个问题弄了很久,因为大部分数据查询都没有问题,当查到某个特定数据的时候就出现了这个,大概意思就是查询时,连接已关闭 然后就去数据库看数据,发现数据表和实体有区别,数据表多了一个列Line,这个列大部分数据是空的.所以大部分查询没问题, 当查到某个Li

Software caused connection abort: recv failed

Software caused connection abort: recv failed 数据库连接时有时会报此错误.客户端建立短连接后,服务端关闭了连接,但是客户端没有关闭,仍然尝试发送请求,就会发生错误. 描述如下: 客户端和服务端建立tcp的短连接,每次客户端发送一次请求, 服务端响应后关闭与客户端的连接. 如果客户端在服务端关闭连接后,没有释放连接,继续试图发送请求和接收响应. 这个时候就会出错. 这个时候客户端Socket的getOutputStream返回来的OutPutStrea