zoukankan      html  css  js  c++  java
  • java.net.SocketException: recvfrom failed: EBADF (Bad file descriptor)

    1. 问题说明:

    与服务器之间进行socket通信的时候,客户端关闭socket之后,会抛出一个IOException,异常信息如下:

    java.net.SocketException: recvfrom failed: EBADF (Bad file descriptor)

    2. 问题分析:

    根据异常分析,定位到这是关闭socket之后持续进行读操作导致

    private InputStream is;
    
    private OutputStream out;
    
    private Socket socket;
    
    private int type;
    
    
    // socket连接
    
    private class CommandReceiver extends Thread {
      
            @Override
            public void run() {
                try {
                    byte[] data;
                    if (socket != null && socket.isConnected() && !socket.isClosed()) {
                        is = socket.getInputStream();
                        while (true) {
                            //读取数据
                            byte[] responseData = readOneFrame(is);
                            //......解析数据
                            //......解析数据
                           switch(type) {
                           case 1:
                                   //业务处理
                                   break;
                           case 2:
                                   is.close();
                                   os.close();
                                   socket.close();
                           default:
                                   break;
                           }
                  }
            }
         }
    }
    

    查看代码得知,这里关闭socket之后,while循环并没有结束,仍然还在进行读操作。

    3.问题解决

    因此需要在socket关闭之后,同时关闭掉while循环,此处将while循环这里增加一个判断的booean值即可。

    private InputStream is;
    
    private OutputStream out;
    
    private Socket socket;
    
    private int type;
    
    private boolean hasRead = false;
    
    
    // socket连接
    
    private hasRead = true;
    
    private class CommandReceiver extends Thread {
      
            @Override
            public void run() {
                try {
                    byte[] data;
                    if (socket != null && socket.isConnected() && !socket.isClosed()) {
                        is = socket.getInputStream();
                        while (hasRead) {
                            //读取数据
                            byte[] responseData = readOneFrame(is);
                            //......解析数据
                            //......解析数据
                           switch(type) {
                           case 1:
                                   //业务处理
                                   break;
                           case 2:
                                   is.close();
                                   os.close();
                                   socket.close();
                                   hasRead=false;
                           default:
                                   break;
                           }
                  }
            }
         }
    }
    

      

     

     

  • 相关阅读:
    自动化原理
    Appium 用途和特点
    接口测试
    测试环境部署
    总结一下,selenium 自动化流程如下
    Qt---tcp之网络通信
    java的接口与抽象类
    Leetcode---每日一题之56合并区间
    java与c++的正则表达式的小总结
    数据结构学习之线索二叉树(java/c++版)
  • 原文地址:https://www.cnblogs.com/xuanwei-qingfeng/p/9948268.html
Copyright © 2011-2022 走看看