void HeartAsync() { new Thread(new ThreadStart(() => { try { while (true) { if (this.Connected) { if (Actived.AddMilliseconds(HeartSpan) <= DateTimeHelper.Now) { var sm = new SocketProtocal() { BodyLength = 0, Type = (byte)SocketProtocalType.Heart }; SendAsync(sm.ToBytes()); } Thread.Sleep(HeartSpan); } else { Thread.Sleep(1); } } } catch { } })) { IsBackground = true }.Start(); }
void ReplyChannelMessage(MessageUserToken userToken, ChatMessage cm) { var channelMsg = ConvertHelper.Deserialize <ChannelMessage>(cm.Content); if (channelMsg != null && !string.IsNullOrEmpty(channelMsg.Name)) { channelMsg.Sender = userToken.ID; channelMsg.Sended = DateTimeHelper.ToString(); var channel = _channelList.Get(channelMsg.Name); if (channel != null && channel.Members != null) { lock (_channelList.SyncLocker) { var ccm = new ChatMessage(ChatMessageType.ChannelMessage, ConvertHelper.Serialize(channelMsg)); var data = ConvertHelper.PBSerialize(cm); var sp = SocketProtocal.Parse(data, SocketProtocalType.ChatMessage).ToBytes(); Parallel.ForEach(channel.Members, (m) => { if (m.ID != userToken.ID) { var r = SessionManager.Get(m.ID); if (r != null) { SendAsync(r, sp); } } }); } } } }
void ReplyBase(IUserToken userToken, ChatMessage cm) { var data = ConvertHelper.PBSerialize(cm); var sp = SocketProtocal.Parse(data, SocketProtocalType.ChatMessage).ToBytes(); SendAsync(userToken, sp); }
private void SendBase(ChatMessage cm) { var data = ConvertHelper.PBSerialize(cm); var content = SocketProtocal.Parse(data, SocketProtocalType.ChatMessage).ToBytes(); this.Send(content); Actived = DateTimeHelper.Now; }
/// <summary> /// 服务器端收包处理 /// </summary> /// <param name="data"></param> /// <param name="OnHeart"></param> /// <param name="OnUnPackage"></param> /// <param name="OnFile"></param> public void Pack(byte[] data, Action <DateTime> onHeart, Action <ISocketProtocal> onUnPackage, Action <byte[]> onFile) { lock (_locker) { _buffer.AddRange(data); while (_buffer.Count >= P_Head) { var buffer = _buffer.ToArray(); var bodyLen = GetLength(buffer); var type = GetType(buffer); if (bodyLen == 0) //空包认为是心跳包 { var sm = new SocketProtocal() { BodyLength = bodyLen, Type = (byte)type }; _buffer.Clear(); onHeart?.Invoke(DateTimeHelper.Now); } else if (buffer.Length >= P_Head + bodyLen) { if (type == SocketProtocalType.BigData) { var content = GetContent(buffer, P_Head, (int)bodyLen); _buffer.RemoveRange(0, (int)(P_Head + bodyLen)); bodyLen = 0; onFile?.Invoke(content); } else { var sm = new SocketProtocal() { BodyLength = bodyLen, Type = (byte)type, Content = GetContent(buffer, P_Head, (int)bodyLen) }; _buffer.RemoveRange(0, (int)(P_Head + bodyLen)); bodyLen = 0; onUnPackage?.Invoke(sm); } } else { return; } } } }
void ReplyGroupMessage(MessageUserToken userToken, ChatMessage cm) { ReplyBase(userToken, new ChatMessage(ChatMessageType.GroupMessageAnswer, "")); var groupMsg = cm.GetIMessage <GroupMessage>(); if (groupMsg != null && !string.IsNullOrEmpty(groupMsg.Name)) { groupMsg.Sender = userToken.ID; groupMsg.Sended = DateTimeHelper.ToString(); var group = _groupList.Get(groupMsg.Name); if (group != null && group.Members != null) { lock (_groupList.SyncLocker) { var ccm = new ChatMessage(ChatMessageType.GroupMessage, groupMsg); var data = ConvertHelper.PBSerialize(cm); var sp = SocketProtocal.Parse(data, SocketProtocalType.ChatMessage).ToBytes(); Parallel.ForEach(group.Members, (m) => { if (m.ID != userToken.ID) { var r = SessionManager.Get(m.ID); if (r != null) { SendAsync(r, sp); } } }); } } } }