首頁>Club>
7
回覆列表
  • 1 # 科學史話

    大家知道,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();

    }

    }

    }

    }

  • 中秋節和大豐收的關聯?
  • 談戀愛需要套路嗎?