Beispiel #1
0
        /// <summary>
        /// 处理ACK消息
        /// </summary>
        /// <param name="bufferMessage"></param>
        private void ProcessMessage_ACK(string bufferMessage)
        {
            var responseAckInfo = bufferMessage.ToObject <Message.ResponseAckInfo>();

            if (EnableEncrypt && responseAckInfo.Data != null)
            {
                try
                {
                    dynamic deString = CommonCryptoService.Decrypt_DES(responseAckInfo.Data.ToString(), responseAckInfo.MessageId);
                    responseAckInfo.Data = CommonExt.JsonStringToDynamic(deString.ToString());
                    LogOpInfo("Receive--Decode", responseAckInfo.ToJsonString());
                }
                catch (Exception ex)
                {
                    LogInfo("用户:DeCryptOp异常", ex);
                    //throw ex;//抛出用户异常
                }
            }

            var requestInfo = m_SendBuffer.FirstOrDefault(x => x.Key == responseAckInfo.MessageId).Value;

            if (requestInfo != null)
            {
                MessageContext context = new MessageContext()
                {
                    IMRequest = requestInfo, IMResponse = responseAckInfo
                };
                if (IsFileMessage(requestInfo.MsgType) && requestInfo.Callback == null)
                {//文件类型消息且用户不提供回调自动下载文件
                    ProcessFileMessage(context);
                }
                else if (requestInfo.Callback != null)
                {//非文件类消息收到ack直接回调
                    requestInfo.Callback(requestInfo, responseAckInfo);
                }
                m_SendBuffer.TryRemove(responseAckInfo.MessageId, out requestInfo);
            }
        }
Beispiel #2
0
        /// <summary>
        /// 处理普通的下行消息
        /// </summary>
        /// <param name="bufferMessage"></param>
        private void ProcessMessage_Response(string bufferMessage)
        {
            var responseInfo = bufferMessage.ToObject <Message.ResponseInfo>();

            if (EnableEncrypt && responseInfo.Data != null)
            {
                try
                {
                    dynamic deString = CommonCryptoService.Decrypt_DES(responseInfo.Data.ToString(), responseInfo.MessageId);
                    responseInfo.Data = CommonExt.JsonStringToDynamic(deString.ToString());
                    LogOpInfo("Receive--Decode", responseInfo.ToJsonString());
                }
                catch (Exception ex)
                {
                    LogInfo("用户:DeCryptOp异常", ex);
                    //throw ex;//抛出用户异常
                }
            }

            if (IsFileMessage(responseInfo.MsgType))
            {
                //用户自己根据url下载,无需处理
            }

            if (OnReceive != null)
            {
                try
                {
                    OnReceive(responseInfo.MsgType, responseInfo.FromId, responseInfo.GroupId, responseInfo.MessageId, responseInfo.MsgTime, responseInfo.Data);
                }
                catch (Exception ex)
                {
                    LogInfo("用户:OnReceive异常", ex);
                    throw ex;//抛出用户异常
                }
            }
        }
Beispiel #3
0
        /// <summary>
        /// 发送消息
        /// </summary>
        /// <param name="type">消息类型,参见枚举MessageType</param>
        /// <param name="to">要接收消息的用户</param>
        /// <param name="group">要接收消息的组</param>
        /// <param name="data">附加数据</param>
        /// <param name="callback">回调</param>
        /// <returns>消息ID</returns>
        public string Send(MessageType type, string to, string group, object data, Action <RequestInfo, ResponseAckInfo> callback)
        {
            var requestInfo = new Message.RequestInfo()
            {
                MsgType = type,
                //MessageId = TimeStamp.Create(),
                ToId     = to,
                GroupId  = group,
                Data     = data,
                Callback = callback
            };
            var preRequestInfo = new Message.RequestInfo()
            {
                MsgType = type,
                //MessageId = TimeStamp.Create(),
                ToId     = to,
                GroupId  = group,
                Data     = data,
                Callback = callback
            };

            LogOpInfo("Send", requestInfo.ToJsonString());

            //连接不可用
            if (!IsAvailable)
            {
                RunUserCallback(callback, requestInfo, new ResponseAckInfo()
                {
                    MessageId = requestInfo.MessageId, MsgType = MessageType.Ack, Status = ResponseCode.NO_AUTH
                });
                return(requestInfo.MessageId);
            }

            if (!Permission.CheckPermission(m_User, type))
            {
                RunUserCallback(callback, requestInfo, new ResponseAckInfo()
                {
                    MessageId = requestInfo.MessageId, MsgType = MessageType.Ack, Status = ResponseCode.NO_PERMISSION
                });
                return(requestInfo.MessageId);
            }

            //深拷贝到请求列表中
            m_SendBuffer.TryAdd(requestInfo.MessageId, new RequestInfo()
            {
                MessageId      = requestInfo.MessageId,
                Callback       = requestInfo.Callback,
                Data           = requestInfo.Data,
                MsgType        = requestInfo.MsgType,
                RelateFileInfo = requestInfo.RelateFileInfo,
                ToId           = requestInfo.ToId,
                Version        = requestInfo.Version,
                GroupId        = requestInfo.GroupId
            });

            if (EnableEncrypt)
            {
                requestInfo.Data = EncryptAdapter.Encode(CommonExt.DynamicToJsonString(requestInfo.Data), requestInfo);
                LogOpInfo("Send--AfterEncode", requestInfo.ToJsonString());
            }
            try
            {
                byte[] sendData = requestInfo.ToByte <Message.RequestInfo>();

                m_Client.BeginSend(sendData, 0, sendData.Length, SocketFlags.None, null, m_Client);

                UpdateTimeForInitiativePing();
            }
            catch (Exception ex)
            {
                ProcessError(requestInfo.MessageId, ex);
                RunUserCallback(callback, preRequestInfo, new ResponseAckInfo()
                {
                    MessageId = requestInfo.MessageId, MsgType = MessageType.Ack, Status = ResponseCode.TIMEOUT
                });
            }

            return(requestInfo.MessageId);
        }
Beispiel #4
0
        /// <summary>
        /// 打开连接
        /// </summary>
        /// <param name="host">服务器地址</param>
        /// <param name="port">服务器端口号</param>
        /// <param name="userType">用户类型</param>
        /// <param name="userName">用户显示的名称</param>
        /// <param name="userAgent">用户登陆的终端信息</param>
        /// <param name="accessToken">访问令牌</param>
        /// <param name="lastTick">收到最后一条消息的UNIX时间戳</param>
        /// <param name="callback">回调函数</param>
        /// <returns>连接是否成功</returns>
        public bool Connect(string host, int port, string userType, string userName, string userAgent, string accessToken, int lastTick, Action <RequestInfo, ResponseAckInfo> callback)
        {
            var requestInfo = new Message.RequestInfo()
            {
                MsgType = MessageType.Connect,
                //MessageId = TimeStamp.Create(),
                Data = new
                {
                    userType    = userType,
                    userName    = userName,
                    userAgent   = userAgent,
                    accessToken = accessToken,
                    lastTick    = lastTick
                },
                Version = Encrypt_Version
            };
            var preRequestInfo = new Message.RequestInfo()
            {
                MsgType = MessageType.Connect,
                Data    = requestInfo.Data,
                Version = Encrypt_Version
            };

            if (IsAvailable)
            {
                //已经连接成功
                if (callback != null)
                {
                    callback(requestInfo, new ResponseAckInfo()
                    {
                        MsgType = MessageType.Ack, Status = ResponseCode.OK
                    });
                }
                return(true);
            }
            bool result = false;

            //开始连接
            try
            {
                m_Client = new Socket(SocketType.Stream, ProtocolType.Tcp);

                if (EnableEncrypt)
                {
                    requestInfo.Data = EncryptAdapter.Encode(CommonExt.DynamicToJsonString(requestInfo.Data), requestInfo);
                }

                LogOpInfo("BeginConnect:", requestInfo.ToJsonString());
                m_Client.Connect(host, port);
                m_IpAddress = host;
                m_Port      = port;
                if (m_Client.Connected)
                {
                    byte[] sendData = requestInfo.ToByte <Message.RequestInfo>();

                    m_Client.Send(sendData);
                    byte[] bufferData   = new byte[BufferSize];
                    int    receiveLen   = m_Client.Receive(bufferData);
                    byte[] receivedData = bufferData.ToList().GetRange(0, receiveLen).ToArray();
                    var    responseInfo = receivedData.ToObject <Message.ResponseAckInfo>();
                    if (EnableEncrypt)
                    {
                        dynamic deString = CommonCryptoService.Decrypt_DES(responseInfo.Data.ToString(), responseInfo.MessageId);
                        responseInfo.Data = CommonExt.JsonStringToDynamic(deString.ToString());
                    }
                    //LogOpInfo("ConnectOver:", responseInfo.ToJsonString());
                    if (responseInfo.Status == ResponseCode.OK)
                    {
                        m_User.IsAuthenticated    = true;
                        m_User.Name               = userName;
                        m_User.Token              = accessToken;
                        m_User.UserAgent          = userAgent;
                        m_User.UserType           = userType;
                        m_User.AuthenticationType = responseInfo.Data.userPermission;
                        m_User.PermissionList     = Permission.GetUserPermission(m_User.AuthenticationType);
                        //连接使用同步
                        // _sendBuffer.Add(requestInfo);
                        m_LastPingTime = DateTime.Now;

                        //启动线程接收
                        AfterConnectedServer();
                        result            = true;
                        m_IsCanConnecting = true;

                        if (this.clientPingMode == PingMode.Initiative)
                        {
                            _lastSendTime = DateTime.Now;
                            PingTimer.Start();
                        }
                    }
                    else
                    {
                        m_Client.Disconnect(true);
                    }

                    RunUserCallback(callback, preRequestInfo, responseInfo);
                }
            }
            catch (Exception ex)
            {
                LogInfo("ConnectError", ex);
                RunUserCallback(callback, preRequestInfo, new ResponseAckInfo()
                {
                    MsgType = MessageType.Ack, Status = ResponseCode.CLINET_ERR, Data = ex.Message
                });
            }

            return(result);
        }