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等都是判斷本地套節字的狀態。要判斷運程的連線,可以通過傳送緊急資料來判斷,緊急資料傳送成功與否,就表示遠端是否斷開。
- publicclass Nksocket extends Thread{
- public String ip=null;//連線伺服器的IP
- public Integer port=null;//連線伺服器的埠
- private Socket socket=null;//套節字物件
- privateboolean close = false; // 關閉連線標誌位,true表示關閉,false表示連線
- private Integer sotimeout=1*1*10;//超時時間,以毫秒為單位
-
//------------------------------------------------------------------------------
- public Nksocket(){
- init();
- }
- public Nksocket(String ip,Integer port){
- setIp(ip);
- setPort(port);
- init();
- }
- /**
- * 初始化socket物件
- */
- publicvoid init(){
- try {
- InetAddress address = InetAddress.getByName(getIp());
- socket = new Socket(address,getPort());
- socket.setKeepAlive(true);//開啟保持活動狀態的套接字
- socket.setSoTimeout(sotimeout);//設定超時時間
- close=!Send(socket,"2");//傳送初始資料,傳送成功則表示已經連線上,傳送失敗表示已經斷開
- }catch(UnknownHostException e) {
- e.printStackTrace();
- }catch(IOException e){
- e.printStackTrace();
- }
- }
- /**
- * 讀資料執行緒
- */
- publicvoid run() {
- while(true){
- //---------讀資料---------------------------
- close = isServerClose(socket);//判斷是否斷開
- if(!close){//沒有斷開,開始讀資料
- String readtext = ReadText(socket);
- if(readtext!=null && readtext.trim().length()>0){
- System.out.println("讀取資料:"+readtext);
- }
- }
- //---------建立連線-------------------------
- while(close){//已經斷開,重新建立連線
- try{
- System.out.println("重新建立連線:"+getIp()+":"+getPort());
- InetAddress address = InetAddress.getByName(getIp());
- socket = new Socket(address,getPort());
- socket.setKeepAlive(true);
- socket.setSoTimeout(sotimeout);
- close = !Send(socket,"2");
- System.out.println("建立連線成功:"+getIp()+":"+getPort());
- }catch(Exception se){
- System.out.println("建立連線失敗:"+getIp()+":"+getPort());
- close=true;
- }
- }
- }
- }
- /**
- * 傳送資料,傳送失敗返回false,傳送成功返回true
- * @param csocket
- * @param message
- * @return
- */
- public Boolean Send(Socket csocket,String message){
- try{
- PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
- out.println(message);
- returntrue;
- }catch(Exception se){
- se.printStackTrace();
- returnfalse;
- }
- }
- /**
- * 讀取資料,返回字串型別
- * @param csocket
- * @return
- */
- public String ReadText(Socket csocket){
- try{
- csocket.setSoTimeout(sotimeout);
- InputStream input = csocket.getInputStream();
- BufferedReader in = new BufferedReader(new InputStreamReader(input));
- char[] sn = newchar[1000];
- in.read(sn);
- String sc = new String(sn);
- return sc;
- }catch(IOException se){
- returnnull;
- }
- }
- /**
- * 判斷是否斷開連線,斷開返回true,沒有返回false
- * @param socket
- * @return
- */
- public Boolean isServerClose(Socket socket){
- try{
- socket.sendUrgentData(0);//傳送1個位元組的緊急資料,預設情況下,伺服器端沒有開啟緊急資料處理,不影響正常通訊
- returnfalse;
- }catch(Exception se){
- returntrue;
- }
- }
- /**
- * 測試
- * @param ags
- */
- publicstaticvoid main(String[] ags){
- Nksocket nksocket = new Nksocket("127.0.0.1",8089);
- nksocket.start();
- }
- //------------------------------------------------------------------------------
- public String getIp() {
- return ip;
- }
- publicvoid setIp(String ip) {
- this.ip = ip;
- }
- public Integer getPort() {
- return port;
- }
- publicvoid setPort(Integer port) {
- this.port = port;
- }
- }
相關推薦
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系列(一)Java中的Socket
最近正在看這本書《看透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