1. 程式人生 > >java中判斷socket網路遠端是否斷開連線

java中判斷socket網路遠端是否斷開連線

原文:http://ivan4126.blog.163.com/blog/static/20949109220135284278806/

最近在開發中遇到一個問題,就是如何判斷遠端伺服器是否已經斷開連線,如果斷開那麼需要重新連線。

首先想到socket類的方法isClosed()、isConnected()、isInputStreamShutdown()、isOutputStreamShutdown()等,但經過試驗並檢視相關文件,這些方法都是本地端的狀態,無法判斷遠端是否已經斷開連線。

然後想到是否可以通過OutputStream傳送一段測試資料,如果傳送失敗就表示遠端已經斷開連線,類似ping,但是這樣會影響到正常的輸出資料,遠端無法把正常資料和測試資料分開。

最後又回到socket類,發現有一個方法sendUrgentData,檢視文件後得知它會往輸出流傳送一個位元組的資料,只要對方Socket的SO_OOBINLINE屬性沒有開啟,就會自動捨棄這個位元組,而SO_OOBINLINE屬性預設情況下就是關閉的,太好了,正是我需要的!

java socekt 同步套節字程式設計主要用到java.net.Socket類,通常情況下我們需要socket的長連線模式。其次就是在連線的另一端斷開之後需要及時響應。

對於連線的判斷,socket提供的isClosed,isConnected等都是判斷本地套節字的狀態。要判斷運程的連線,可以通過傳送緊急資料來判斷,緊急資料傳送成功與否,就表示遠端是否斷開。


  1. publicclass Nksocket extends Thread{  
  2. public String ip=null;//連線伺服器的IP
  3. public Integer port=null;//連線伺服器的埠
  4. private Socket socket=null;//套節字物件
  5. privateboolean close = false// 關閉連線標誌位,true表示關閉,false表示連線
  6. private Integer sotimeout=1*1*10;//超時時間,以毫秒為單位
  7. //------------------------------------------------------------------------------
  8. public Nksocket(){  
  9.    init();  
  10. }  
  11. public Nksocket(String ip,Integer port){  
  12.    setIp(ip);  
  13.    setPort(port);  
  14.    init();  
  15. }  
  16. /** 
  17. * 初始化socket物件 
  18. */
  19. publicvoid init(){  
  20.    try {  
  21.     InetAddress address = InetAddress.getByName(getIp());  
  22.     socket = new Socket(address,getPort());  
  23.     socket.setKeepAlive(true);//開啟保持活動狀態的套接字
  24.     socket.setSoTimeout(sotimeout);//設定超時時間
  25.     close=!Send(socket,"2");//傳送初始資料,傳送成功則表示已經連線上,傳送失敗表示已經斷開
  26.    }catch(UnknownHostException e) {  
  27.     e.printStackTrace();  
  28.    }catch(IOException e){  
  29.     e.printStackTrace();  
  30.    }  
  31. }  
  32. /** 
  33. * 讀資料執行緒 
  34. */
  35. publicvoid run() {  
  36.    while(true){  
  37.     //---------讀資料---------------------------
  38.     close = isServerClose(socket);//判斷是否斷開
  39.     if(!close){//沒有斷開,開始讀資料
  40.      String readtext = ReadText(socket);  
  41.      if(readtext!=null && readtext.trim().length()>0){  
  42.       System.out.println("讀取資料:"+readtext);  
  43.      }  
  44.     }  
  45.     //---------建立連線-------------------------
  46.     while(close){//已經斷開,重新建立連線
  47.      try{  
  48.       System.out.println("重新建立連線:"+getIp()+":"+getPort());  
  49.       InetAddress address = InetAddress.getByName(getIp());  
  50.       socket = new Socket(address,getPort());  
  51.       socket.setKeepAlive(true);  
  52.       socket.setSoTimeout(sotimeout);  
  53.       close = !Send(socket,"2");  
  54.       System.out.println("建立連線成功:"+getIp()+":"+getPort());  
  55.      }catch(Exception se){  
  56.       System.out.println("建立連線失敗:"+getIp()+":"+getPort());  
  57.       close=true;  
  58.      }  
  59.     }  
  60.    }  
  61. }  
  62. /** 
  63. * 傳送資料,傳送失敗返回false,傳送成功返回true 
  64. * @param csocket 
  65. * @param message 
  66. * @return 
  67. */
  68. public Boolean Send(Socket csocket,String message){  
  69.    try{  
  70.     PrintWriter out = new PrintWriter(socket.getOutputStream(), true);  
  71.     out.println(message);  
  72.     returntrue;  
  73.    }catch(Exception se){  
  74.     se.printStackTrace();  
  75.     returnfalse;  
  76.    }  
  77. }  
  78. /** 
  79. * 讀取資料,返回字串型別 
  80. * @param csocket 
  81. * @return 
  82. */
  83. public String ReadText(Socket csocket){  
  84.    try{  
  85.     csocket.setSoTimeout(sotimeout);  
  86.     InputStream input = csocket.getInputStream();  
  87.     BufferedReader in = new BufferedReader(new InputStreamReader(input));  
  88.     char[] sn = newchar[1000];  
  89.     in.read(sn);  
  90.     String sc = new String(sn);  
  91.     return sc;  
  92.    }catch(IOException se){  
  93.     returnnull;  
  94.    }  
  95. }  
  96. /** 
  97. * 判斷是否斷開連線,斷開返回true,沒有返回false 
  98. * @param socket 
  99. * @return 
  100. */
  101. public Boolean isServerClose(Socket socket){  
  102.    try{  
  103.     socket.sendUrgentData(0);//傳送1個位元組的緊急資料,預設情況下,伺服器端沒有開啟緊急資料處理,不影響正常通訊
  104.     returnfalse;  
  105.    }catch(Exception se){  
  106.     returntrue;  
  107.    }  
  108. }  
  109. /** 
  110. * 測試 
  111. * @param ags 
  112. */
  113. publicstaticvoid main(String[] ags){  
  114.    Nksocket nksocket = new Nksocket("127.0.0.1",8089);  
  115.    nksocket.start();  
  116. }  
  117. //------------------------------------------------------------------------------
  118. public String getIp() {  
  119.    return ip;  
  120. }  
  121. publicvoid setIp(String ip) {  
  122.    this.ip = ip;  
  123. }  
  124. public Integer getPort() {  
  125.    return port;  
  126. }  
  127. publicvoid setPort(Integer port) {  
  128.    this.port = port;  
  129. }  
  130. }  

相關推薦

java判斷socket網路遠端是否斷開連線

原文:http://ivan4126.blog.163.com/blog/static/20949109220135284278806/ 最近在開發中遇到一個問題,就是如何判斷遠端伺服器是否已經斷開連線,如果斷開那麼需要重新連線。 首先想到socket類的方法isCl

java判斷socket伺服器端是否斷開連線

   最近在開發中遇到一個問題,就是如何判斷遠端伺服器是否已經斷開連線,如果斷開那麼需要重新連線。 首先想到socket類的方法isClosed()、isConnected()、isInputStreamShutdown()、isOutputStreamShutdown()

C#判斷socket是否已斷開的方法

 C#中判斷socket是否已斷開的方法        記得以前Delphi/BCB裡的socket程式設計,要判斷[連線的另一方]是否斷開了,只要在ondisconnect事件裡處理就行了!如今在C#

安卓 java有效判斷Socket連線斷開和安卓TCP測試APP(客戶+服務端一體)

1. 利用socket提供的isConnected()與isClosed()方法來判斷。但這種方式只是本地判斷,只是本地操作connect()或close()方法後儲存的一個狀態,對於遠端伺服器主動斷開

java判斷字串漢字的個數

使用方法3與方法4時需要注意一些問題,程式碼中會有註釋。 程式碼如下: package 包名; import java.util.ArrayList; import java.util.regex.Matcher; import java.util.regex.Pattern; publ

java判斷字串郵箱的個數

使用到:郵箱的正則表示式,列表的部分知識,Matcher方法 package 包名; import java.util.ArrayList; import java.util.regex.Matcher; import java.util.regex.Pattern; public cla

Java判斷一句英文有多少個以p開頭的單詞

package Pak01; public class TestString { public static void main(String[] args) {      String s="peter piper picked a peck of pickled p

Java判斷奇數偶數,實測

看了一些帖子,發現有些錯誤,於是自己做了些修改,並進行了測試 package insertString; public class insertTest { public static void main(String[] args) { System.out.println

Java判斷字串是否為數字的五種方法

//方法一:用JAVA自帶的函式 public static boolean isNumeric(String str){ for (int i = str.length();--i>=0;){ if (!Character.isDigit(st

java判斷兩個浮點型(float)資料是否相等

示例程式碼: public static void main(String[] args) { float a = 10.222222225f; float b = 10.222222229f; System.out.println("使用==判斷是否相等:" + (

java判斷Object物件型別

                Object param = params.get(i);   if (param instanceof Integer) {    int value = ((Integer) param).intValue();    prepStatement.setInt(i + 1,

Java使用socket實現客戶端與服務端互動

Socket解釋: 網路上的兩個程式通過一個雙向的通訊連線實現資料的交換,這個連線的一端稱為一個socket。 Socket的英文原義是“孔”或“插座”。作為BSD UNIX的程序通訊機制,取後一種意思。通常也稱作"套接字",用於描述IP地址和埠,是一個通訊鏈的控制代碼,可以用來實現不同虛擬機器或不同計

java判斷字串是否是一個整數(轉載)

1.使用型別轉換判斷   try {                  String str="123abc";                  int num=Integer.valueOf(str);//把字串強制轉換為數字                  retu

20-java 物件連結串列空沒空呢 java判斷list是否為空的用法

 寫了一個 物件連結串列,往裡面add了一些物件,最後我想看下連結串列是否為空,用  == null  為假,也看不出, 看下長度? 好吧, size() = 1; 列印  null ,  那到底是不是空 啊, 仔細想下,連結串列裡面應該不空,size( )

java判斷一個字串是否為整型數字

/** * 判斷字串是否為數字 */ public static boolean isNumeric(String str){ Pattern patte

看透SpringMVC系列(一)JavaSocket

最近正在看這本書《看透SpringMVC:原始碼分析與實戰》,作者韓路彪。 推薦用微信讀書APP,下面基本照抄上面的,覺得不過癮可以去自己看 Java中的Socket分為兩種:普通socket和NioSocket。 同步阻塞IO(JAVA BIO):    

java利用jsch執行遠端命令,實現sftp

利用jsch可以執行遠端命令並實現sftp檔案傳輸,以下為自定義的util: import com.jcraft.jsch.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; impor

java判斷素數的六種方法

轉載地址:http://java.e800.com.cn/articles/2010/1110/1289376854382_1.html  1. 根據概念判斷: 如果一個正整數只有兩個因子, 1和p,則稱p為素數. public boolean isPrime(in

java判斷物件屬性值是否為空

最近遇到後臺接收值的時候,需要對接收物件進行非空校驗,第一時間想到的就是寫一堆的if判斷,但是仔細想了想,如果欄位的屬性太多,需要寫大量的if判斷,並且方法也不能夠重用,所以,就搜尋了相關資料看看有沒有通用的方法來實現,現將方法記錄如下: 思路是,使用java中的反射機制

java判斷位元組陣列的編碼方式是不是UTF-8

1,用google的工具包,配置maven: <!-- https://mvnrepository.com/artifact/com.googlecode.juniversalchardet/juniversalchardet --> <depende