`
lihua-he
  • 浏览: 102253 次
  • 性别: Icon_minigender_2
  • 来自: 上海
社区版块
存档分类
最新评论

udp简单通讯示例---心跳示例

阅读更多
//发送心跳
new UDPToPointCenter(18056).start();   

public class UDPToPointCenter extends Thread {
private static Logger logger = Logger.getLogger("com.hintsoft.pubwin.netcafe.socket.UDPToPointCenter");

private int listenPort;   //发送的端口号
private static DatagramSocket sock;
private Timer timer;
private PooledExecutor _processExecutor = new PooledExecutor(new LinkedQueue(), 1);  //序列化
protected static PooledExecutor clientPool;

public UDPToPointCenter(int aListenPort) {
        try {
            this.timer = new Timer();
            this.listenPort = aListenPort;
            sock = new DatagramSocket(this.listenPort);
            this.timer.schedule(new ConnSvrTask(),1 * 10 * 1000,Global.UDP_SYNC_SIGNAL_INTERVAL);
           
            _processExecutor.setMaximumPoolSize(5);
            _processExecutor.setMinimumPoolSize(1);
            _processExecutor.setKeepAliveTime(10 * 1000);
            _processExecutor.waitWhenBlocked();
            _processExecutor.createThreads(1);
        }
        catch (SocketException e) {
            logger.error(e, e);
        }
        catch (Exception e) {
            logger.error(e, e);
        }
    }

private class ConnSvrTask extends TimerTask {
        private Logger logger = Logger.getLogger("com.hintsoft.pubwin.netcafe.socket.ConnSvrTask");
       
        public ConnSvrTask() {
            super();
        }
        public void run() {
            try {
                byte[] b = new byte[21];
                DatagramPacket packet = new DatagramPacket(b, b.length);
                // 发送心跳
    try {
   
    byte[] desData = new byte[1024];
                    packet = new DatagramPacket(desData, desData.length, InetAddress.getByName(CachedConfigObject.getServerCenterCfgOtherObj().getPointCenterIP()), 18060);
                 
                    sock.send(packet);
                    }catch (UnknownHostException e) {
                    logger.error(e, e);
                }catch (IOException e) {
                    logger.error(e, e);
                }
            }
            catch (Exception e) {
                logger.error(e, e);
            }
        }
    }
}


//接收心跳
new UderServerListen(18060).start();

public class UderServerListen extends Thread {
private static Logger logger = Logger.getLogger("com.hintsoft.pubwin.netcafe.socket.UdpServerClient");

private static DatagramSocket sock;
private List iplist;
private int listenPort;
private PooledExecutor _processExecutor = new PooledExecutor(new LinkedQueue(), 1);
private long udpBarBeg = System.currentTimeMillis();//开始搜索心跳的时间

public UderServerListen(int listenPort){
try {
            this.iplist = Global.getAllIpAddress();
            this.listenPort = listenPort;
            sock = new DatagramSocket(this.listenPort);
           
            _processExecutor.setMaximumPoolSize(5);
            _processExecutor.setMinimumPoolSize(1);
            _processExecutor.setKeepAliveTime(10 * 1000);
            _processExecutor.waitWhenBlocked();
            _processExecutor.createThreads(1);
        }
        catch (SocketException e) {
            logger.error(e, e);
        }catch (Exception e) {
            logger.error(e, e);
        }
}
public void run() {
      if (sock == null) {
       return;
      }

      while(true){
          try {
             byte[] data = new byte[1024];
              DatagramPacket packet = new DatagramPacket(data, data.length);

              sock.receive(packet);
              UDPPacketProcessor processor = new UDPPacketProcessor(packet);

              _processExecutor.execute(processor);
          }
          catch (java.net.SocketException e) {
              logger.error(e, e);
          }
          catch (java.net.UnknownHostException e) {
              logger.error(e, e);
          }
          catch (java.io.IOException e) {
              logger.error(e, e);
          }
          catch (Exception e) {
              logger.error(e, e);
          }
      }
  }
private class UDPPacketProcessor implements Runnable {

        private DatagramPacket _packet;

        public UDPPacketProcessor(DatagramPacket packet) {
            _packet = packet;
        }

        public void run() {
            try {
            List barList = new ArrayList();
            barList.addAll(iplist);
                String clientIP = _packet.getAddress().getHostAddress();
                if(logger.isDebugEnabled()){
                logger.debug("接收到的ip "+clientIP);
                }
                if (iplist.contains(clientIP)) {
                Global.setBarStatus(Global.BAR_STATUS_ONLINE, clientIP);
                for(int index=0;index<barList.size();index++){
                if(barList.get(index).equals(clientIP)){
                barList.remove(index);
                }
                }
                }else{
                //判断心跳断开时间是否超过1小时,超过1小时则视为不在线
                    if (System.currentTimeMillis() - udpBarBeg >  1 * 60 * 60 * 1000L){
                    if(null!=barList && barList.size()>0){
                    for(int i=0;i<barList.size();i++){
                    Global.setBarStatus(Global.BAR_STATUS_UNONLINE, barList.get(i).toString());
                    }
                    }
                    }
                }
            }catch(Exception e){
            logger.error(e,e);
            }
        }
}
}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics