欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

如何解決TCP?socket的阻塞問題

 更新時(shí)間:2021年12月13日 15:49:48   作者:shusy411  
這篇文章主要介紹了如何解決TCP?socket的阻塞問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

解決TCP socket的阻塞問題

大家知道,tcp的讀和寫是阻塞的,即讀的時(shí)候不知道什么時(shí)候讀完,寫的時(shí)候不知道什么時(shí)候?qū)懲辏虼司€程就一直暫停在哪里,一般tcp程序用在上位機(jī)下位機(jī)之間對(duì)吧!

下位機(jī)一些設(shè)備一般會(huì)發(fā)心跳報(bào)文給我們機(jī)器,假設(shè)為10s發(fā)一次吧,當(dāng)機(jī)器超過10s沒接收到數(shù)據(jù),那么我們就要考慮把socket斷開,因?yàn)椴粩嚅_的話設(shè)備重新連接可能又會(huì)建立新的socket,這樣如果設(shè)備反復(fù)斷開連接的話,將產(chǎn)生大量的socket,占用大量系統(tǒng)資源,這里我們用socket.setSoTimeout(500)方法解決read方法的阻塞問題,同時(shí)設(shè)定一個(gè)標(biāo)志位

在異常處理程序當(dāng)中退出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 {
    // 讀取數(shù)據(jù)
    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連接阻塞的監(jiān)控和處理

那么,什么樣的TCP連接屬于上述發(fā)生阻塞的異常連接呢?結(jié)合線上運(yùn)維經(jīng)驗(yàn)

我們整理出符合該類異常的特征如下

  • 該連接的Recv_Q的值特別大(超過3M)
  • 該連接的Recv_Q的值持續(xù)上漲,造成堆積(在一定滑動(dòng)時(shí)間窗口內(nèi))
  • 服務(wù)端進(jìn)程已長(zhǎng)時(shí)間不再處理該連接的請(qǐng)求(超過90秒)

其中Recv_Q的值可以通過netstat或ss系統(tǒng)工具即可進(jìn)行Recv_Q隊(duì)列大小的采樣,從而進(jìn)行閥值判斷。

netstat 的結(jié)果是讀取/proc/net/tcp文件而來的.

如何查看一個(gè)連接的創(chuàng)建時(shí)間

1.nestat -apn | grep xxx查看到對(duì)應(yīng)的連接的進(jìn)程pid和端口

2. 將上下游端口,轉(zhuǎn)換為16進(jìn)制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文件的創(chuàng)建時(shí)間.

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • java 獲取用戶的MAC地址多種方法實(shí)例詳解

    java 獲取用戶的MAC地址多種方法實(shí)例詳解

    這篇文章主要介紹了JAVA實(shí)現(xiàn)獲取用戶的MAC地址的多種方法實(shí)例,需要的朋友可以參考下
    2017-04-04
  • 簡(jiǎn)單易懂的java8新特性之lambda表達(dá)式知識(shí)總結(jié)

    簡(jiǎn)單易懂的java8新特性之lambda表達(dá)式知識(shí)總結(jié)

    一直想針對(duì)lambda表達(dá)式作一個(gè)總結(jié),借助于這次公司安排的考試作一個(gè)入門式的總結(jié),對(duì)正在學(xué)習(xí)java的小伙伴們非常有幫助,需要的朋友可以參考下
    2021-05-05
  • java實(shí)現(xiàn)撲克牌分發(fā)功能

    java實(shí)現(xiàn)撲克牌分發(fā)功能

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)撲克牌分發(fā),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • 解析Java實(shí)現(xiàn)隨機(jī)驗(yàn)證碼功能的方法詳解

    解析Java實(shí)現(xiàn)隨機(jī)驗(yàn)證碼功能的方法詳解

    本篇文章是對(duì)Java實(shí)現(xiàn)隨機(jī)驗(yàn)證碼功能的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • Freemarker 最簡(jiǎn)單的例子程序

    Freemarker 最簡(jiǎn)單的例子程序

    Freemarker最簡(jiǎn)單的例子程序是通過String來創(chuàng)建模版對(duì)象,并執(zhí)行插值處理。
    2016-04-04
  • Java中抽象類和接口的用法詳解

    Java中抽象類和接口的用法詳解

    這篇文章主要為大家詳細(xì)介紹了Java中抽象類和接口的使用,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-08-08
  • 詳解JSON與?Java對(duì)象之間的轉(zhuǎn)化

    詳解JSON與?Java對(duì)象之間的轉(zhuǎn)化

    在現(xiàn)在的日常開發(fā)中,不管前端還是后端,JSON?格式的數(shù)據(jù)是用得比較多的,甚至可以說無處不在。所以本文主要來講講JSON?格式的數(shù)據(jù)與?Java?對(duì)象之間的轉(zhuǎn)化吧
    2023-03-03
  • Java ArrayList類的基礎(chǔ)使用講解

    Java ArrayList類的基礎(chǔ)使用講解

    數(shù)組的長(zhǎng)度是固定的,無法適應(yīng)數(shù)據(jù)變化的需求。為了解決這個(gè)問題,Java提供了另一個(gè)容器 java.util.ArrayList集合類,讓我們可以更便捷的存儲(chǔ)和操作對(duì)象數(shù)據(jù)。本文就將通過示例聊聊ArrayList類的基礎(chǔ)使用,感興趣的可以了解一下
    2022-10-10
  • java編寫汽車租賃系統(tǒng)

    java編寫汽車租賃系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了java編寫汽車租賃系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • 詳解Spring Boot 打包分離依賴JAR 和配置文件

    詳解Spring Boot 打包分離依賴JAR 和配置文件

    這篇文章主要介紹了Spring Boot 打包分離依賴JAR 和配置文件,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11

最新評(píng)論