解決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();
				}

			}
		}
		}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章