Unity&网络:利用UDP实现动态监测局域网在线用户及掉线事件

发表于2018-11-01
评论0 2.1k浏览
服务器-客户端:一个抽象软件概念。客户端向服务器发送请求,服务器根据请求给客户端以服务。并非指一台电脑。同一台电脑可以利用多线程同时充当服务器与客户端的角色。

P2P:一个电脑既是客户端也是服务器。对于对方发来的请求可以回复,可以不回复,可提供服务,可反过来进行其他请求。

UDP:一个重要的网络协议,两点很重要。
  1. 保证:保证到达对方处的包裹的数据完整及正确。
  2. 不保证:包裹到达的顺序,唯一性,以及不丢失。

了解服务器-客户端、P2P、以及UDP的基本概念以后,下面就来看看利用UDP实现动态监测局域网在线用户及掉线事件,以及需要考虑到那些情况。

广播:广播地址是一个特殊网络地址,向此地址发送消息,路由器将它接收到的消息转发给所有在线的用户。

机制:

发现在线用户

机制1-上线第一时间通知
  1. 上线后第一时间向广播地址发送“我上线了”消息。
  2. 所有P2P节点收到“我上线了”消息后将消息发送方IP地址保存在在线P2P节点列表中。

机制2-定时寻找在线用户
  1. 每隔一段时间,P2P节点向发出广播消息“谁在线?”。
  2. 所有P2P节点收到“谁在线?”消息后回复“我在线”。
  3. 所有P2P节点收到“我在线”消息后将消息发送方IP地址保存在在线P2P节点列表中。

动态监测掉线事件

机制1-下线第一时间通知
  1. 下线后第一时间向广播地址发送“我下线了”消息。
  2. 所有P2P节点收到“我下线了”消息后将消息发送方IP地址从在线P2P节点列表中删除。

机制2-通过同步变量分析在线P2P节点列表中的服务器是否掉线。
准备工作:
设变量“第N次打招呼次数”=0;
将P2P节点抽象成一个类,内设有变量“回复了第N次打招呼”。
  1. 每隔一段时间,P2P节点向发出广播消息“谁在线?”,发送后变量第N次打招呼次数+1。
  2. 所有P2P节点收到“谁在线?”消息后回复“我在线”。
  3. 所有P2P节点在n时间内收到“我在线”消息后检查发送方IP地址是否保存在在线P2P节点列表中。
  4. 如果是,此P2P节点类的“回复了第N次打招呼”=“第N次打招呼次数”。
  5. 以一定频率检查P2P节点列表。对比每个P2P节点类的“回复了第N次打招呼”变量与“第N次打招呼次数”变量,(第N次打招呼次数-回复了第N次打招呼)*时间n既是此P2P节点的连续不在线时长,可选择判定此节点是否掉线。
图中B_Count既是变量“第N次打招呼次数”和“回复了第N次打招呼”。B_Count_S为“连续打招呼次数”,此变量每次广播后都要递增,清理字典后则归0。
变量n1决定了广播与接收消息次数的比例,n2决定了清理在线节点列表的频率。n1,n2此俩变量比较微妙,结合实际网络环境决定了此架构的准确率与实时性。

至此,实现了一套简单的局域网P2P服务器架构,每个P2P节点在一个线程内完成了实时检测同局域网其他节点的上线与下线情况的功能。
来自:https://blog.csdn.net/liu_if_else/article/details/70872459

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引