/// <summary> /// 向分组中添加主机 /// </summary> /// <param name="peer">要添加的主机</param> /// <param name="name">分组的标识</param> /// <returns>是否添加成功</returns> public static bool add(Peer peer, string name) { try { if (Singleton.BaseGet(name) == null) Singleton.BaseSet(name, new List<Peer>()); List<Peer> list = Singleton.BaseGet(name) as List<Peer>; list.Add(peer); return true; } catch { return false; } }
/// <summary> /// 向分组中添加主机 /// </summary> /// <param name="peer">要添加的主机</param> /// <param name="index">分组的标识</param> /// <returns>是否添加成功</returns> public static bool add(Peer peer, int index) { try { if (Singleton.BaseGet(index) == null) Singleton.BaseSet(index, new List<Peer>()); List<Peer> list = Singleton.BaseGet(index) as List<Peer>; list.Add(peer); return true; } catch { return false; } }
/// <summary> /// 通知同步返回 /// </summary> /// <param name="sender">发送消息的主机</param> /// <param name="msg">消息</param> public static void doCallBack(Peer sender, Msg msg) { if (ht[msg.type] != null) { List<CallBack> list = ht[msg.type] as List<CallBack>; lock (list) { for (int i = 0; i < list.Count; i++) list[i].data = msg.data; ht[msg.type] = null; } } }
/// <summary> /// 处理其他消息 /// </summary> /// <param name="peer">消息来源主机</param> /// <param name="msg">消息</param> private static void OtherMessage(Peer peer, Msg msg) { switch (msg.type) { case 21: peer.close(); IPAddress add = msg.data as IPAddress; Socket s = NetUtils.TestConnect(new IPEndPoint(add, Configuration.Port)); if (s == null) HoldingServer.Singleton.TestServer(); else HoldingServer.Singleton.ClientStart(new Peer(s, Message)); break; } }
/// <summary> /// 处理管理主机消息 /// </summary> /// <param name="peer">消息来源主机</param> /// <param name="msg">消息</param> private static void ServerMessage(Peer peer, Msg msg) { switch (msg.type) { case 11: HostInfo info = msg.data as HostInfo; peer.info.id = info.id; ResHost curHost = HostManager.Singleton[info.id.ToString()]; if (curHost == null) return; curHost.rGroup(info.groups); curHost.searchService = info.SearchService; HoldingServer.Singleton.UpdateServices(HostGroup.getServices(HoldingServer.Self)); Group.send(new Msg(13)); break; case 12: peer.send(new Msg(13, HostGroup.getServices(msg.data as string[]))); break; case 22: peer.send(new Msg(21, HoldingServer.Client.remote)); break; } }
/// <summary> /// 处理主机断开 /// </summary> /// <param name="peer">断开的主机</param> public static void onPeerQuit(Peer peer) { if (HoldingServer.State == 1) { if (peer.info.id == null) return; ResHost rh = HostManager.Singleton[peer.info.id.ToString()]; if (rh != null) rh.rGroup(new string[0]); } else if(peer == HoldingServer.Client.server) HoldingServer.Start(false); }
/// <summary> /// 处理部分消息的FinalDeal事件 /// </summary> /// <param name="peer">消息要发送到的主机</param> /// <param name="msg">消息</param> public static void onFinalDeal(Peer peer, Msg msg) { switch (msg.type) { case 13: if (peer.info.id == null) { msg.valid = false; return; } msg.valid = true; ResHost rh = HostManager.Singleton[peer.info.id.ToString()]; msg.data = HostGroup.getServices(rh); break; } }
/// <summary> /// 消息路由函数 /// </summary> /// <param name="peer">消息来源主机</param> /// <param name="msg">消息</param> public static void onMessage(Peer peer, Msg msg) { if (HoldingServer.State == 1) ServerMessage(peer, msg); else if (HoldingServer.State == 2) ClientMessage(peer, msg); else OtherMessage(peer, msg); CallBack.doCallBack(peer, msg); }
/// <summary> /// 获取分组是否包含主机 /// </summary> /// <param name="peer">要查看的主机</param> /// <param name="name">分组的标识</param> /// <returns>主机是否在分组中</returns> public static bool contains(Peer peer, string name) { try { if (Singleton.BaseGet(name) == null) Singleton.BaseSet(name, new List<Peer>()); List<Peer> list = Singleton.BaseGet(name) as List<Peer>; return list.Contains(peer); } catch { return false; } }
/// <summary> /// 从所有分组中删除主机 /// </summary> /// <param name="peer">要删除的主机</param> public static void remove(Peer peer) { for (int i = 0; i < Singleton.Count; i++) { if (Singleton.BaseGet(i) as List<Peer> != null) { List<Peer> list = Singleton.BaseGet(i) as List<Peer>; list.Remove(peer); } } }
/// <summary> /// Tcp接受主机异步回调函数 /// </summary> /// <param name="r">异步结果</param> protected void Accept(IAsyncResult r) { try { Socket remotePoint = tcpListener.EndAccept(r); Peer peer = new Peer(remotePoint); if (onAccept != null) onAccept(peer); if (state % 10 == 1) tcpListener.BeginAccept(new AsyncCallback(Accept), null); } catch { } }
/// <summary> /// 本机以非管理主机身份开启分布式系统 /// </summary> /// <param name="peer">管理主机</param> public void ClientStart(Peer peer) { client.remote = peer.info.ipep.Address; client.server = peer; peer.onFinalDeal += MessageDealer.FinalDeal; peer.onPeerQuit += MessageDealer.PeerQuit; peer.send(new Msg(11, new HostInfo())); lis.StartTcpAccept(); state = 2; }
/// <summary> /// Tcp监听接受回调函数 /// </summary> /// <param name="sender">接受的主机</param> void lis_onAccept(Peer sender) { if (state == 2) { sender.send(new Msg(21, client.remote)); sender.close(); return; } sender.onMessage += MessageDealer.Message; sender.onFinalDeal += MessageDealer.FinalDeal; sender.onPeerQuit += MessageDealer.PeerQuit; }