/// <summary> /// 关闭服务器 /// </summary> public void ServerStop() { try { BroadcastMessage(new Data(HeadInformation.ServerOffline)); _Server.Close(); _Server.Dispose(); ClientIDBase = 0; ClientList.Clear(); } catch (Exception ex) { } }
/// <summary> /// 接收客户端消息 /// </summary> /// <param name="client">客户端实例</param> void ReceiveMessages(object client) { try { Client _client = (Client)client; while (true) { // 接收客户端消息 Data data = _client.Receive(); // 触发事件 ReceiveMessages_Event?.Invoke(data, _client); // 判断头部信息类型 if (data.HeadInfo == HeadInformation.Message) // 消息 { // 判断是否为私聊消息 if (data.Data_Message.ToClientID != 0) // 私聊 { // 发送私聊消息 SendMessageToClientByID(data.Data_Message.ToClientID, data); } else // 群聊 { // 广播群聊消息 BroadcastMessage(data); } } else if (data.HeadInfo == HeadInformation.ClientOffline) // 客户端离线 { ClientList.Remove(ClientList.Find(i => i.ClientID == data.Data_Message.ClientID)); // 广播客户端离线消息 BroadcastMessage(new Data(HeadInformation.ClientOffline, new Message() { ClientID = data.Data_Message.ClientID, ClientName = data.Data_Message.ClientName })); } } } catch (Exception ex) { // 终止当前线程 Thread.CurrentThread.Abort(); } }
/// <summary> /// 向指定客户端发送消息 /// </summary> /// <param name="ClientID">客户端ID</param> /// <param name="data">消息data</param> void SendMessageToClientByID(int ClientID, Data data) { ClientList.Find(i => i.ClientID == ClientID).Send(data); }
/// <summary> /// 添加客户端对象至客户端容器 /// </summary> /// <param name="client">客户端实例对象</param> bool AddClienToClientList(Client client) { try { bool sign = true; client.Send(new Data(HeadInformation.CheckConnectState)); Data result = client.Receive(); if (OnlineClientCount != 0 && ClientList.Exists(i => i.ClientName == result.Data_Message.ClientName)) { sign = false; client.Send(new Data(HeadInformation.CheckConnectState, new Message() { Sign = sign })); } else { int ClientID = ++ClientIDBase; string ClientName = result.Data_Message.ClientName; client.ClientID = ClientID; client.ClientName = ClientName; ClientList.Add(client); List <ClientList> onlineClientList = new List <ClientList>(); foreach (var item in ClientList) { onlineClientList.Add(new ClientList() { ClientID = item.ClientID, ClientName = item.ClientName }); } Message msg = new Message() { ClientID = ClientID, ClientName = ClientName, Sign = sign, OnlineClientList = onlineClientList }; client.Send(new Data(HeadInformation.CheckConnectState, msg)); AddClienToClientList_Event?.Invoke(client); BroadcastMessage(new Data(HeadInformation.ClientOnline, new Message() { ClientID = ClientID, ClientName = ClientName })); } return(sign); } catch (Exception ex) { return(false); } }