大家知道,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) {
// 讀取資料
int readlen = is.read(buff);
if (readlen > 0) {
flag = 0;
byte data[] = Arrays.copyOfRange(buff, 0, readlen);
resolveData(data);
} catch (IOException e) {
flag++;
if (flag == 200) {
is.close();
os.close();
socket.close();
} catch (Exception e1) {
e1.printStackTrace();
大家知道,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();
}
}
}
}