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 都市淘沙者 阅读(3150) 评论(0)  编辑  收藏 所属分类: Java Basic/Lucene/开源资料


只有注册用户登录后才能发表评论。


网站导航: