如何解决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 获取用户的MAC地址多种方法实例详解

    java 获取用户的MAC地址多种方法实例详解

    这篇文章主要介绍了JAVA实现获取用户的MAC地址的多种方法实例,需要的朋友可以参考下
    2017-04-04
  • 简单易懂的java8新特性之lambda表达式知识总结

    简单易懂的java8新特性之lambda表达式知识总结

    一直想针对lambda表达式作一个总结,借助于这次公司安排的考试作一个入门式的总结,对正在学习java的小伙伴们非常有帮助,需要的朋友可以参考下
    2021-05-05
  • java实现扑克牌分发功能

    java实现扑克牌分发功能

    这篇文章主要为大家详细介绍了java实现扑克牌分发,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-05-05
  • 解析Java实现随机验证码功能的方法详解

    解析Java实现随机验证码功能的方法详解

    本篇文章是对Java实现随机验证码功能的方法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • Freemarker 最简单的例子程序

    Freemarker 最简单的例子程序

    Freemarker最简单的例子程序是通过String来创建模版对象,并执行插值处理。
    2016-04-04
  • Java中抽象类和接口的用法详解

    Java中抽象类和接口的用法详解

    这篇文章主要为大家详细介绍了Java中抽象类和接口的使用,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-08-08
  • 详解JSON与 Java对象之间的转化

    详解JSON与 Java对象之间的转化

    在现在的日常开发中,不管前端还是后端,JSON 格式的数据是用得比较多的,甚至可以说无处不在。所以本文主要来讲讲JSON 格式的数据与 Java 对象之间的转化吧
    2023-03-03
  • Java ArrayList类的基础使用讲解

    Java ArrayList类的基础使用讲解

    数组的长度是固定的,无法适应数据变化的需求。为了解决这个问题,Java提供了另一个容器 java.util.ArrayList集合类,让我们可以更便捷的存储和操作对象数据。本文就将通过示例聊聊ArrayList类的基础使用,感兴趣的可以了解一下
    2022-10-10
  • java编写汽车租赁系统

    java编写汽车租赁系统

    这篇文章主要为大家详细介绍了java编写汽车租赁系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • 详解Spring Boot 打包分离依赖JAR 和配置文件

    详解Spring Boot 打包分离依赖JAR 和配置文件

    这篇文章主要介绍了Spring Boot 打包分离依赖JAR 和配置文件,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11

最新评论