如何解决TCP socket的阻塞问题

目录
  • 解决TCP socket的阻塞问题
    • 在异常处理程序当中退出socket连接
  • TCP连接阻塞的监控和处理
    • 我们整理出符合该类异常的特征如下
    • 如何查看一个连接的创建时间

解决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文件的创建时间.

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

(0)

相关推荐

  • Java实现Socket的TCP传输实例

    本文实例讲述了Java实现Socket的TCP传输.分享给大家供大家参考.具体分析如下: 客户端发数据到服务端 * Tcp传输,客户端建立的过程. * 1,创建tcp客户端socket服务.使用的是Socket对象. * 建议该对象一创建就明确目的地.要连接的主机. * 2,如果连接建立成功,说明数据传输通道已建立. * 该通道就是socket流 ,是底层建立好的. 既然是流,说明这里既有输入,又有输出. * 想要输入或者输出流对象,可以找Socket来获取. * 可以通过getOutputSt

  • java socket长连接中解决read阻塞的3个办法

    解决的方法有3个 : 1 约定发送的数据长度,比如 http的 keepAlive 就是必须依赖这个的 Content-Length 2 设置超时的时间,根据我的经验,只有在Socket级别设置才有效. 复制代码 代码如下: Socket socket = new Socket(host,port); socket.setSoTimeout(100); // 如果超过100毫秒还没有数据,则抛出 SocketTimeoutException 3 让发送端发送完数据后,关闭连接. 这个在Http的

  • java实现基于Tcp的socket聊天程序

    对于步入编程行业不深的初学者或是已经有所领会的人来说,当学习一项新的技术的时候,非常渴望有一个附上注释完整的Demo.本人深有体会,网上的例子多到是很多,但是很杂不完整,写代码这种东西来不得半点马虎,要是错了一点,那也是运行不了的.这对于初学者来说更加的头疼,因为他根本不知道错在哪里,盲目的改只能错上加错.最后不得不去找找看看有没有能够直接运行的例子再加以模仿. 下面是博主在学习Java的socket时写的一个完整的例子,并且带上了完整的注释.它是一个简单的聊天程序,但是它可以设置任意多用户同时

  • java实现基于TCP协议网络socket编程(C/S通信)

    一.前言:TCP原理简介 首先,保证文章完整性,TCP的理论原理还是需要简介一下,略显枯燥๑乛◡乛๑. TCP(传输控制协议,Transmission Control Protocol)是一种面向连接的.可靠的.基于字节流的传输层通信协议.TCP旨在适应支持多网络应用的分层协议层次结构.也就是说,TCP是为了在不可靠的互联网络上提供可靠的端到端字节流而专门设计的一个传输协议. 连接到不同但互连的计算机通信网络的主计算机中的成对进程之间依靠TCP提供可靠的通信服务. 以上TCP的特点,也正是与UD

  • 如何解决TCP socket的阻塞问题

    目录 解决TCP socket的阻塞问题 在异常处理程序当中退出socket连接 TCP连接阻塞的监控和处理 我们整理出符合该类异常的特征如下 如何查看一个连接的创建时间 解决TCP socket的阻塞问题 大家知道,tcp的读和写是阻塞的,即读的时候不知道什么时候读完,写的时候不知道什么时候写完,因此线程就一直暂停在哪里,一般tcp程序用在上位机下位机之间对吧! 下位机一些设备一般会发心跳报文给我们机器,假设为10s发一次吧,当机器超过10s没接收到数据,那么我们就要考虑把socket断开,因

  • 如何解决TCP socket的阻塞问题

    目录 解决TCP socket的阻塞问题 在异常处理程序当中退出socket连接 TCP连接阻塞的监控和处理 我们整理出符合该类异常的特征如下 如何查看一个连接的创建时间 解决TCP socket的阻塞问题 大家知道,tcp的读和写是阻塞的,即读的时候不知道什么时候读完,写的时候不知道什么时候写完,因此线程就一直暂停在哪里,一般tcp程序用在上位机下位机之间对吧! 下位机一些设备一般会发心跳报文给我们机器,假设为10s发一次吧,当机器超过10s没接收到数据,那么我们就要考虑把socket断开,因

  • python TCP Socket的粘包和分包的处理详解

    概述 在进行TCP Socket开发时,都需要处理数据包粘包和分包的情况.本文详细讲解解决该问题的步骤.使用的语言是Python.实际上解决该问题很简单,在应用层下,定义一个协议:消息头部+消息长度+消息正文即可. 那什么是粘包和分包呢? 关于分包和粘包 粘包:发送方发送两个字符串"hello"+"world",接收方却一次性接收到了"helloworld". 分包:发送方发送字符串"helloworld",接收方却接收到了两

  • Python中的TCP socket写法示例

    前言 本文主要介绍了关于Python中TCP socket的写法,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 一. 服务器server的写法: 1. 创建 socket 套接字: 网络编程接口 socket(family = AF_INET , type = SOCKET_STREM,proto = 0, fileno = None)   提供了多种socket family.AF_INET 是默认的family,需要绑定IP和端口. 127.0.0.1是一个特殊的IP地址

  • Python socket非阻塞模块应用示例

    本文实例讲述了Python socket非阻塞模块应用.分享给大家供大家参考,具体如下: 一 服务端程序 # 导入模块 import socketserver import random # 定义一个类 class MyServer(socketserver.BaseRequestHandler): # 如果handle方法出现报错,则会进行跳过 # setup方法和finish方法无论如何都会进行执行 # 首先执行setup def setup(self): pass # 然后执行handle

  • node.js中TCP Socket多进程间的消息推送示例详解

    前言 前段时间接到了一个支付中转服务的需求,即支付数据通过http接口传到中转服务器,中转服务器将支付数据发送到异构后台(Lua)的指定tcp socket. 一开始评估的时候感觉蛮简单的,就是http server和tcp server间的通信,不是一个Event实例就能解决的状态管理问题吗?注册一个事件A用于消息传递,在socket连接时注册唯一的ID,然后在http接收到数据时,emit事件A:在监听到事件A时,在tcp server中寻找指定ID对应的socket处理该数据即可. 尽管n

  • Java 基于TCP Socket 实现文件上传

    文件上传过程一个单向Socket通信过程.客户端通过文件输入流读取文件,然后从Socket获取输出流写入数据.服务端从Socket中获得输入流,然后写入文件输出流,写入数据完成则上传完成. 服务端UploadServer: public class UplaodServer { public static void main(String []args){ try( // 创建一个ServerSocket监听8080端口的请求 // ServerSocket 实现了 AutoCloseable接

  • java实现TCP socket和UDP socket的实例

    目录 概述 传输层概述 TCP套接字编程 大致过程 详细过程 UDP套接字编程 补充 概述 我们在网络编程时,通常是让我们本地的应用程序和远程的应用程序进行通信,也就是分布式的进程之间的通信,比如我写的程序A和小明的程序B进行通信,我的程序运行时在本机就是一个进程,是有pid号的,小明的也是.那这两个程序是怎么通信的呢? 这就要理解网络分层的概念了,网络层实现的是主机到主机之间的通信,网络层的实现是ip协议,通过各自的ip地址就能实现远程数据传输,而网络层只是保证了主机A的数据能够到达主机B,并

  • Python基础教程之tcp socket编程详解及简单实例

    Python tcp socket编程详解 初学脚本语言Python,测试可用的tcp通讯程序: 服务器: #!/usr/bin/env python # -*- coding: utf-8 -*- import socket import threading import time def tcplink(sock, addr): print('Accept new connection from %s:%s...' % addr); sock.send(b'Welcome!!!'); whi

  • tcp socket客户端和服务端示例分享

    以下是tcp socket客户端和服务端源码,代码简单大家参考使用吧 Tcp Server 复制代码 代码如下: #include <WinSock2.h>#include <stdio.h>#pragma comment(lib, "ws2_32.lib")int main(){// initial socket libraryWORD wVerisonRequested;WSADATA wsaData;int err;wVerisonRequested =

随机推荐