Example #1
0
 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();
 }
Example #2
0
        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);
                                }
                            }
                        });
                    }
                }
            }
        }
Example #3
0
        void ReplyBase(IUserToken userToken, ChatMessage cm)
        {
            var data = ConvertHelper.PBSerialize(cm);

            var sp = SocketProtocal.Parse(data, SocketProtocalType.ChatMessage).ToBytes();

            SendAsync(userToken, sp);
        }
Example #4
0
        private void SendBase(ChatMessage cm)
        {
            var data = ConvertHelper.PBSerialize(cm);

            var content = SocketProtocal.Parse(data, SocketProtocalType.ChatMessage).ToBytes();

            this.Send(content);

            Actived = DateTimeHelper.Now;
        }
Example #5
0
        /// <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;
                    }
                }
            }
        }
Example #6
0
        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);
                                }
                            }
                        });
                    }
                }
            }
        }