tcp端口阻塞解決方法?
大家知道,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();
}
}
}
}