Dict.CN 在線詞典, 英語學(xué)習(xí), 在線翻譯

          都市淘沙者

          荔枝FM Everyone can be host

          統(tǒng)計(jì)

          留言簿(23)

          積分與排名

          優(yōu)秀學(xué)習(xí)網(wǎng)站

          友情連接

          閱讀排行榜

          評(píng)論排行榜

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

          一般是用來判斷對(duì)方(設(shè)備,進(jìn)程或其它網(wǎng)元)是否正常動(dòng)行,一般采用定時(shí)發(fā)送簡單的通訊包,如果在指定時(shí)間段內(nèi)未收到對(duì)方響應(yīng),則判斷對(duì)方已經(jīng)當(dāng)?shù)簟S糜跈z測TCP的異常斷開。


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

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

          發(fā)包方:可以是客戶也可以是服務(wù)端,看哪邊實(shí)現(xiàn)方便合理。一般是客戶端。服務(wù)器也可以定時(shí)輪詢發(fā)心跳下去。

          一般來說,出于效率的考慮,是由客戶端主動(dòng)向服務(wù)器端發(fā)包,而不是相反。

          示例代碼:

          import org.apache.log4j.Logger;

          import com.example.HeartBeat;//是一個(gè)普通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;
              }

              
              
          /**
               * 向監(jiān)控服務(wù)器發(fā)送包
               * 
          @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) 評(píng)論(0)  編輯  收藏 所屬分類: Java Basic/Lucene/開源資料

          主站蜘蛛池模板: 九龙坡区| 治多县| 象州县| 信丰县| 临漳县| 社旗县| 特克斯县| 恩平市| 府谷县| 洮南市| 龙南县| 禄丰县| 米脂县| 洱源县| 临泽县| 久治县| 定西市| 澜沧| 岫岩| 贵阳市| 陆河县| 荥经县| 崇阳县| 贵溪市| 阜城县| 两当县| 泌阳县| 黄浦区| 酒泉市| 栖霞市| 斗六市| 汝城县| 沁源县| 曲水县| 达拉特旗| 桓仁| 鲜城| 辛集市| 文登市| 南澳县| 陆川县|