Dict.CN 在線詞典, 英語學習, 在線翻譯

          都市淘沙者

          荔枝FM Everyone can be host

          統計

          留言簿(23)

          積分與排名

          優秀學習網站

          友情連接

          閱讀排行榜

          評論排行榜

          心跳包檢測不可檢測斷線 (轉)

          一般是用來判斷對方(設備,進程或其它網元)是否正常動行,一般采用定時發送簡單的通訊包,如果在指定時間段內未收到對方響應,則判斷對方已經當掉。用于檢測TCP的異常斷開。


          基本原因是服務器端不能有效的判斷客戶端是否在線也就是說,服務器無法區分客戶端是長時間在空閑,還是已經掉線的情況.所謂的心跳包就是客戶端定時發送簡單的信息給服務器端告訴它我還在而已。

          代碼就是每隔幾分鐘發送一個固定信息給服務端,服務端收到后回復一個固定信息
          如果服務端幾分鐘內沒有收到客戶端信息則視客戶端斷開。比如有些通信軟件長時間不使用,要想知道它的狀態是在線還是離線就需要心跳包,定時發包收包。

          發包方:可以是客戶也可以是服務端,看哪邊實現方便合理。一般是客戶端。服務器也可以定時輪詢發心跳下去。

          一般來說,出于效率的考慮,是由客戶端主動向服務器端發包,而不是相反。

          示例代碼:

          import org.apache.log4j.Logger;

          import com.example.HeartBeat;//是一個普通POJO

          public class HeartBeatRunnable implements Runnable {
              
          /**
               * Logger for this class
               
          */

              
          private static final Logger logger = Logger.getLogger(HeartBeatRunnable.class);
              
          private HeartBeatRunnable() {
              }


              
          private static HeartBeatRunnable instance = null;

              
          public static HeartBeatRunnable getInstance() {
                  
          if (instance == null{
                      instance 
          = new HeartBeatRunnable();
                  }

                  
          return instance;
              }

              
              
          private int interval = 10000;//心跳周期
              private boolean stoped = false;
              
              
          public HeartBeatRunnable(int interval) {
                  
          this.interval = interval;
              }


              
          public void run() {
                  HeartBeat bean 
          = new HeartBeat();
                  
          while (!stoped) {
                      
          try {
          //                logger.debug("heart beat");
                          HttpSender.sendToServer(bean);
                          
          synchronized (this{
                              
          this.wait(interval);
                          }

                      }
           catch (Exception e) {
                          logger.debug(
          "", e);
                      }

                  }

              }


              
          public void destroy() {
                  stoped 
          = true;        
                  
          synchronized (this{
                      
          this.notify();
                  }

              }


              
          public int getInterval() {
                  
          return interval;
              }


              
          public void setInterval(int interval) {
                  
          this.interval = interval;
              }


          }

          HttpSender代碼:

          import java.io.BufferedReader;
          import java.io.InputStreamReader;
          import java.io.OutputStream;
          import java.net.HttpURLConnection;
          import java.net.URL;

          import org.apache.log4j.Logger;

          import com.example.BaseBean;//是HeatBean的父類,這里就不提供了

          public class HttpSender {
              
              
          private static Logger log = Logger.getLogger(HttpSender.class);
              
              
          private static boolean connectURL(String dest_url, String commString)
              
          {
                  log.debug(
          "POST TO: "+dest_url);
                  URL url 
          = null;
                  HttpURLConnection urlconn 
          = null;
                  
          try
                  
          {
                      url 
          = new URL(dest_url);
                      urlconn 
          = (HttpURLConnection) url.openConnection();
                      urlconn.setRequestProperty(
          "content-type""text/plain");
                      urlconn.setRequestMethod(
          "POST");
                      urlconn.setDoInput(
          true);
                      urlconn.setDoOutput(
          true);
                      OutputStream out 
          = urlconn.getOutputStream();
                      out.write(commString.getBytes(
          "UTF8"));
                      out.flush();
                      out.close();
                      BufferedReader rd 
          = new BufferedReader(new InputStreamReader(
                              urlconn.getInputStream()));
                      StringBuffer sb 
          = new StringBuffer();
                      
          int ch;
                      
          while ((ch = rd.read()) > -1{
                          sb.append((
          char) ch);
                      }

                      log.debug(
          "POST RESPONSE: " + sb.toString());
                      rd.close();
                      urlconn.disconnect();
                  }

                  
          catch (Throwable e)
                  
          {
                      log.error(e.getMessage(), e);
                      
          return false;
                  }


                  
          return true;
              }

              
              
          /**
               * 向監控服務器發送包
               * 
          @param bean
               * 
          @return
               
          */

              
          public static boolean sendToServer(BaseBean bean) {
                  
          return connectURL(System.getProperty("server_url"), bean.constructString());
              }


          }


          posted on 2007-12-07 17:43 都市淘沙者 閱讀(3180) 評論(0)  編輯  收藏 所屬分類: Java Basic/Lucene/開源資料

          主站蜘蛛池模板: 开平市| 米林县| 巴楚县| 丰都县| 通渭县| 宁阳县| 鄯善县| 青冈县| 衡南县| 金塔县| 乌恰县| 沙坪坝区| 通化县| 富阳市| 柳州市| 桐梓县| 宜宾县| 靖西县| 宁津县| 靖江市| 霸州市| 宁陕县| 博罗县| 浮梁县| 航空| 丁青县| 登封市| 平谷区| 南投市| 永州市| 平山县| 汤阴县| 于田县| 淮南市| 道孚县| 屏东市| 海安县| 潮州市| 三穗县| 彩票| 达尔|