//发送心跳
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);
}
}
}
}
分享到:
相关推荐
本示例是关于如何在C#环境下实现一个简单的UDP通信过程,主要关注客户端的实现。 首先,了解UDP的特点是理解这个示例的基础。与TCP(Transmission Control Protocol)不同,UDP不建立连接,不保证数据的顺序和完整...
在本文中,我们将深入探讨如何使用C#进行UDP网络通信,并通过心跳机制确保连接稳定性。首先,我们需要了解UDP(User Datagram Protocol)的基本概念。UDP是一种无连接的传输协议,它不保证数据包的顺序、可靠性和...
文件名“tio-udp-showcase-master”暗示这是一个示例项目,可能包含了完整的TIO UDP应用案例。在这个项目中,你可以找到如何配置服务器和客户端,以及如何处理数据交互的示例代码。通过学习这个案例,可以更直观地...
UDP不保证数据包的顺序、完整性和可靠性,它仅仅提供一个简单的端到端服务,允许数据快速发送,无需建立连接。这意味着发送方可以随时发送数据,而接收方则可能接收到乱序或丢失的数据包。这种特性使得UDP适用于实时...
UDP通讯DEMO(C#)是基于C#编程语言实现的一个通信示例,它演示了如何在Windows和WINCE操作系统上进行用户数据报协议(UDP)的通信。UDP是一种无连接的、不可靠的传输层协议,它在互联网协议族中扮演着重要的角色,...
文件名"Socket-UDP-长链接"可能包含了示例代码或者文档,这些资源可以帮助你理解和实现上述机制。为了创建一个稳定的UDP长链接,开发者需要深入理解网络协议,并具备良好的编程技巧,以确保在不可靠的网络环境中实现...
"真正的Delphi点对点UDP通讯实例"是一个示例程序,展示了如何利用Delphi编程环境实现UDP协议的点对点通信,尤其在穿透NAT(Network Address Translation)的情况下。这里我们将深入探讨相关的知识点。 首先,UDP...
在IT行业中,Socket编程是一种广泛应用于网络通信的技术,它允许两...文件"socket1"可能是项目源代码或示例,进一步展示了如何在实际开发中实施这些概念。学习和掌握这些技术,对于开发实时、可靠的网络应用至关重要。
UDP提供了一种简单且高效的服务,适用于实时数据传输或对延迟敏感的应用,因为它不保证数据包的顺序、可靠性和错误检查。下面我们将深入探讨UDP的基本概念、Java中的UDP编程以及给出的源码可能涉及的关键点。 1. ...
在本示例中,我们将深入探讨如何在Qt中实现一个简单的UDP(用户数据报协议)通信。UDP是一种无连接的、不可靠的传输层协议,适用于对实时性要求较高的应用,如视频会议、在线游戏等。 首先,我们需要包含必要的Qt...
- 在实际项目中,UDP常用于实现简单聊天应用、实时音视频传输、分布式系统中的心跳检测等场景。 - 为了保证数据的可靠性,开发者可能需要自己实现重传机制、序列号和确认机制,这在某些场景下是值得的,因为它可以...
这个简单的UDP聊天程序只是一个基础示例,实际应用中还需要考虑如何处理并发连接、多用户交互、安全性等问题。你可以根据需求进一步扩展和完善,比如添加用户认证、加密通信、心跳机制等。通过实践,不仅能深入理解...
请注意,这只是一个基础示例,实际项目中需要根据具体需求进行扩展和优化,比如添加多线程、队列处理、心跳机制等。同时,记得在完成通信后释放资源,调用`client.Close()`关闭UDP客户端。 在使用上述代码时,请...
以上就是Unity UDP局域网通信的基本知识和应用,实际开发中还需要结合具体项目需求进行优化和扩展,例如增加心跳机制、处理丢包重传、多线程优化等。提供的资源包含了服务端和客户端示例,可以作为学习和参考的基础...
在提供的"第10章"文件中,很可能包含了实现UDP P2P打洞的具体代码示例,包括心跳包的发送和接收逻辑。这部分代码通常会涉及以下关键部分: - **初始化**:设置本地监听端口,初始化连接到服务器的socket。 - **心跳...
在提供的文件`HClient`和`HServer`中,很可能是实现了心跳连接的客户端和服务端示例代码。分析这些代码可以帮助理解上述概念在实际项目中的应用。通过学习和理解心跳连接的原理与实现,开发者可以创建出更健壮、稳定...
然而,当我们谈论“WPF框架下UDP通讯”时,我们指的是如何在WPF应用中实现基于User Datagram Protocol(UDP)的网络通信。 UDP是一种无连接的传输层协议,相比TCP(Transmission Control Protocol)更加轻量级,不...
本压缩包包含了一个C#实现的UDP组播的示例,分为接收端和发送端两个程序。下面将详细介绍这两个关键部分的工作原理和相关知识点。 1. **UDP组播的基本概念**: - 组播地址:不同于单播和广播,组播使用D类IP地址...
本篇文章将详细解析一个基于Java实现的简单UDP通信代码,帮助理解如何在Java中控制超时和重发机制。 首先,我们要了解UDP的基础知识。UDP不保证数据的顺序、完整性或可靠性,它的工作方式更像是“尽力而为”的传输...
HPSocket简化了Socket编程的复杂性,提供了一套稳定、高效、易于使用的API,使得断线重连、消息接收与发送、客户端管理等任务变得简单。 2. **Socket通讯原理**: Socket是网络编程中的一个接口,它允许应用程序...