如何解决TCP socket的阻塞问题

 更新时间:2021年12月13日 15:49:48   作者:shusy411  
这篇文章主要介绍了如何解决TCP socket的阻塞问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

解决TCP socket的阻塞问题

大家知道,tcp的读和写是阻塞的,即读的时候不知道什么时候读完,写的时候不知道什么时候写完,因此线程就一直暂停在哪里,一般tcp程序用在上位机下位机之间对吧!

下位机一些设备一般会发心跳报文给我们机器,假设为10s发一次吧,当机器超过10s没接收到数据,那么我们就要考虑把socket断开,因为不断开的话设备重新连接可能又会建立新的socket,这样如果设备反复断开连接的话,将产生大量的socket,占用大量系统资源,这里我们用socket.setSoTimeout(500)方法解决read方法的阻塞问题,同时设定一个标志位

在异常处理程序当中退出socket连接

 public void run(){
     InputStream is = null;
  OutputStream os = null;
  int flag = 0;
  try {
   socket.setSoTimeout(500); //  0.5秒就退出read()方法的阻塞
   is = socket.getInputStream();
   os = socket.getOutputStream();

  } catch (Exception e2) {
   e2.printStackTrace();
  }

 while (true) {
   try {
    // 读取数据
    int readlen = is.read(buff);
    if (readlen > 0) {
     flag = 0;
    }
    byte data[] = Arrays.copyOfRange(buff, 0, readlen);
    resolveData(data);
   } catch (IOException e) {
    try {

     flag++;
     if (flag == 200) {    
      is.close();
      os.close();
      socket.close();

     }
    } catch (Exception e1) {
     e1.printStackTrace();
    }

   }
  }
  }

TCP连接阻塞的监控和处理

那么,什么样的TCP连接属于上述发生阻塞的异常连接呢?结合线上运维经验

我们整理出符合该类异常的特征如下

  • 该连接的Recv_Q的值特别大(超过3M)
  • 该连接的Recv_Q的值持续上涨,造成堆积(在一定滑动时间窗口内)
  • 服务端进程已长时间不再处理该连接的请求(超过90秒)

其中Recv_Q的值可以通过netstat或ss系统工具即可进行Recv_Q队列大小的采样,从而进行阀值判断。

netstat 的结果是读取/proc/net/tcp文件而来的.

如何查看一个连接的创建时间

1.nestat -apn | grep xxx查看到对应的连接的进程pid和端口

2. 将上下游端口,转换为16进制xxxa xxxb

3.然后cat /proc/net/tcp | grep -i xxxa | grep -i xxxb找到该socket连接的inode inodex

4.ls -al /proc/pid/fd | grep inodex即可看见该socket文件的创建时间.

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • java实现俄罗斯方块游戏

    java实现俄罗斯方块游戏

    这篇文章主要为大家详细介绍了java实现俄罗斯方块游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-02-02
  • Java实现聊天机器人完善版

    Java实现聊天机器人完善版

    这篇文章主要为大家详细介绍了Java实现聊天机器人完善版,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • SpringBoot整合mybatis的方法详解

    SpringBoot整合mybatis的方法详解

    这篇文章主要为大家详细介绍了SpringBoot整合mybatis的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • 详谈Java枚举、静态导入、自动拆装箱、增强for循环、可变参数

    详谈Java枚举、静态导入、自动拆装箱、增强for循环、可变参数

    下面小编就为大家带来一篇详谈Java枚举、静态导入、自动拆装箱、增强for循环、可变参数。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • Java实现无损Word转PDF的示例代码

    Java实现无损Word转PDF的示例代码

    本文将利用Java中的两个jar包:pdfbox和aspose-words实现无损Word转PDF功能,文中的示例代码讲解详细,感兴趣的小伙伴可以动手尝试一下
    2022-06-06
  • MyBatis逆向工程生成dao层增删改查的操作

    MyBatis逆向工程生成dao层增删改查的操作

    这篇文章主要介绍了MyBatis逆向工程生成dao层增删改查的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • IDEA 2020.1打开时闪退的问题及解决方法(完美解决方法)

    IDEA 2020.1打开时闪退的问题及解决方法(完美解决方法)

    这篇文章主要介绍了IDEA 2020.1打开时闪退问题及解决方法,本文给大家分享我的处理方案,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-04-04
  • Spring Boot整合持久层之JdbcTemplate多数据源

    Spring Boot整合持久层之JdbcTemplate多数据源

    持久层是JavaEE中访问数据库的核心操作,SpringBoot中对常见的持久层框架都提供了自动化配置,例如JdbcTemplate、JPA 等,MyBatis 的自动化配置则是MyBatis官方提供的。接下来分别向读者介绍Spring Boot整合这持久层技术中的整合JdbcTemplate
    2022-08-08
  • SpringBoot整合H2数据库的操作方法

    SpringBoot整合H2数据库的操作方法

    H2是一个Java语言编写的嵌入式数据库,它不受平台的限制,同时H2提供了一个十分方便的web控制台,用于操作和管理数据库内容,本文介绍SpringBoot整合H2数据库的方法,感兴趣的朋友一起看看吧
    2024-01-01
  • Netty如何设置为Https访问

    Netty如何设置为Https访问

    这篇文章主要介绍了Netty如何设置为Https访问,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06

最新评论