java学习网络编程遇到异常java.net.SocketException:Software caused connection abort: socket write error

  • Post author:
  • Post category:java


在模拟客户端和服务器之间通信时出现java.net.SocketException:Software caused connection abort: socket write error

java.net.SocketException: Software caused connection abort: socket write error
	at java.base/java.net.SocketOutputStream.socketWrite0(Native Method)
	at java.base/java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:110)
	at java.base/java.net.SocketOutputStream.write(SocketOutputStream.java:150)
	at java.base/java.io.ObjectOutputStream$BlockDataOutputStream.drain(ObjectOutputStream.java:1883)
	at java.base/java.io.ObjectOutputStream$BlockDataOutputStream.setBlockDataMode(ObjectOutputStream.java:1792)
	at java.base/java.io.ObjectOutputStream.writeNonProxyDesc(ObjectOutputStream.java:1287)
	at java.base/java.io.ObjectOutputStream.writeClassDesc(ObjectOutputStream.java:1232)
	at java.base/java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1428)
	at java.base/java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1179)
	at java.base/java.io.ObjectOutputStream.writeFatalException(ObjectOutputStream.java:1583)
	at java.base/java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:352)
	at task010305.net.Server.handlerRequest(Server.java:67)
	at task010305.net.Server.lambda$start$0(Server.java:35)
	at java.base/java.lang.Thread.run(Thread.java:834)

我出现的情形是当服务器对资源进行释放时客户端还处于连接中,当客户端再次请求时就会出现

Software caused connection abort: socket write error



Socket closed

的异常,当客户端进行释放资源时服务器也会出现同样的错误

客户端(client):

public void start(){
        OutputStream os;
        ObjectOutputStream oos = null;
        InputStream is;
        ObjectInputStream ois = null;
        try {
            do {
                client=new Socket("127.0.0.1",PROT);
                os=client.getOutputStream();
                oos=new ObjectOutputStream(os);
                is=client.getInputStream();
                ois=new ObjectInputStream(is);
                System.out.println("客户端连接服务器成功");
            } while (view.startMenu(ois,oos)!=0);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (ois != null)
                    ois.close();
                if (oos != null)
                    oos.close();
                if (client != null)
                    client.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

服务器(Server):

public void start(){

            try {
                serverSocket=new ServerSocket(PROT);
                System.out.println("服务器已就绪!目前端口为:"+PROT);
                while (true){
                    //等待客户端连接
                    Socket socket=serverSocket.accept();
                    System.out.println(socket.hashCode()+"客户端为您服务!");
                    //每个客户端进行开辟单独的线程服务
                    new Thread(() -> {
                        //处理客户端请求
                        handlerRequest(socket);
                    }).start();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
    }

private void handlerRequest(Socket socket){
        InputStream is;
        ObjectInputStream ois = null;
        OutputStream os;
        ObjectOutputStream oos = null;

        try {
            is=socket.getInputStream();
            ois=new ObjectInputStream(is);
            os=socket.getOutputStream();
            oos=new ObjectOutputStream(os);

            //客户端发的请求类型
            String flag= ois.readUTF();
            System.out.println("客户端请求类型:"+flag+",当前使用线程为:"+Thread.currentThread().getName());
            do {

                if ("findAll".equals(flag)) {
                    Express allExpress = ed.findAllExpress();
                    if (allExpress!=null)
                        oos.writeObject(allExpress);
                    else
                        oos.writeObject("快递柜中暂无快递!");
                }
            } while (true);
        } catch (IOException e) {
            e.printStackTrace();
            //System.out.println(e.getMessage());
        } finally {
            try {
                if (ois != null)
                    ois.close();
                if (oos != null)
                    oos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

造成问题是因为在循环中一边先结束了关闭了资源

解决方法:

  1. 因为服务器需要一直运行,所以对客户端进行判断,如果连接为空或者连接被关闭进行重新连接
  2. 或者在服务器中对请求方法进行死循环让本次请求在线程未结束前不关闭释放资源



版权声明:本文为weixin_45060779原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。