コード例 #1
0
ファイル: BasicOutter.cs プロジェクト: hessonsu/ONetworkTalk
        public void SendBlob(string destID, int contractID, IMessage body, int blobSize = 1024)
        {
            List <MessagePacket> packets = new List <MessagePacket>();

            byte[] buffer     = body.ToByteArray();
            int    blobLength = buffer.Length / blobSize;

            if (blobLength != 0 && buffer.Length % blobLength > 0)
            {
                blobLength++;
            }
            int blobID = MessageIDCreater.GetNewID();

            if (blobLength == 0)
            {
                BlobContract contract = new BlobContract()
                {
                    BlobID        = blobID,
                    FragmentIndex = 0,
                    Fragment      = ByteString.CopyFrom(buffer),
                    IsLast        = true
                };
                packets.Add(new MessagePacket(GloblParams.CurrentClientID, destID,
                                              GloblParams.CurrentClientType, MessageType.Blob, contractID, contract.ToByteArray()));
            }
            else
            {
                for (int i = 0; i < blobLength; i++)
                {
                    int    startIndex = i * blobSize;
                    int    endIndex   = ((i + 1) * blobSize) > buffer.Length ? buffer.Length : ((i + 1) * blobSize);
                    int    length     = endIndex - startIndex;
                    byte[] sendBuffer = new byte[length];
                    System.Buffer.BlockCopy(buffer, startIndex, sendBuffer, 0, length);
                    BlobContract contract = new BlobContract()
                    {
                        BlobID        = blobID,
                        FragmentIndex = i,
                        Fragment      = ByteString.CopyFrom(sendBuffer),
                        IsLast        = i == blobLength
                    };
                    packets.Add(new MessagePacket(GloblParams.CurrentClientID, destID,
                                                  GloblParams.CurrentClientType, MessageType.Blob, contractID, contract.ToByteArray()));
                }
            }


            messageBus.SendMessage(packets);
        }
コード例 #2
0
        public void Process(RequestInfo request)
        {
            var message = request.MessagePacket;

            try
            {
                #region Noraml
                if (message.MessageHeader.MessageType == MessageType.Noraml)
                {
                    if (message.MessageHeader.DestUserID == GloblParams.DefaultServerID)
                    {
                        customizeHandler.Handle(message.MessageHeader.SourceUserID, message.ContractID, message.BodyContent);
                    }
                    else
                    {
                        basicController.Send(message.MessageHeader.DestUserID, message);
                    }
                }
                #endregion

                #region Ack_Req
                else if (message.MessageHeader.MessageType == MessageType.Ack_Req)
                {
                    if (message.MessageHeader.DestUserID == GloblParams.DefaultServerID)
                    {
                        ResponseAck(request.Channel, message);
                        customizeHandler.Handle(message.MessageHeader.SourceUserID, message.ContractID, message.BodyContent);
                    }
                    else
                    {
                        basicController.Send(message.MessageHeader.DestUserID, message);
                    }
                }
                #endregion

                #region Blob
                else if (message.MessageHeader.MessageType == MessageType.Blob)
                {
                    if (message.MessageHeader.DestUserID == GloblParams.DefaultServerID)
                    {
                        BlobContract contract = BlobContract.Parser.ParseFrom(message.BodyContent);
                        string       keyStr   = message.MessageHeader.SourceUserID + contract.BlobID.ToString();
                        BlobItem     item     = hotDic.Get(keyStr);
                        if (item == null)
                        {
                            item = new BlobItem();
                            hotDic.Add(keyStr, item);
                        }
                        item.Add(contract.FragmentIndex, contract.Fragment);
                        if (contract.IsLast)
                        {
                            BlobItem     blob   = this.hotDic.GetAndRemove(keyStr);
                            MemoryStream stream = new MemoryStream();
                            foreach (var blobItem in blob)
                            {
                                blobItem.Value.WriteTo(stream);
                            }
                            byte[] bytes = stream.ToArray();
                            stream.Dispose();
                            customizeHandler.Handle(message.MessageHeader.SourceUserID, message.ContractID, bytes);
                        }
                    }
                    else
                    {
                        basicController.Send(message.MessageHeader.DestUserID, message);
                    }
                }
                #endregion

                #region Ack_Resp
                else if (message.MessageHeader.MessageType == MessageType.Ack_Resp)
                {
                    basicController.Send(message.MessageHeader.DestUserID, message);
                }
                #endregion

                #region Query_Req
                else if (message.MessageHeader.MessageType == MessageType.Query_Req)
                {
                    if (message.MessageHeader.DestUserID == GloblParams.DefaultServerID)
                    {
                        byte[] result = customizeHandler.HandleQuery(message.MessageHeader.SourceUserID, message.ContractID, message.BodyContent);
                        ResponseQuery(request.Channel, MessageType.Query_Resp, message, result);
                    }
                    else
                    {
                        basicController.Send(message.MessageHeader.DestUserID, message);
                    }
                }
                #endregion

                #region Query_Resp
                else if (message.MessageHeader.MessageType == MessageType.Query_Resp)
                {
                    basicController.Send(message.MessageHeader.DestUserID, message);
                }
                #endregion

                #region Login
                else if (message.MessageHeader.MessageType == MessageType.Login)
                {
                    LoginContract       loginContract = LoginContract.Parser.ParseFrom(message.BodyContent);
                    string              cause;
                    LoginResultContract result = null;
                    bool verResult             = basicHandler.VerifyUser(loginContract, request.Channel, out cause);
                    this.basicController.userManager.Add(loginContract.Uid, request.Channel);
                    result = new LoginResultContract()
                    {
                        Result  = verResult ? 0 : 1,
                        Failure = cause
                    };
                    ResponseQuery(request.Channel, MessageType.LoginResp, message, result.ToByteArray());
                }
                #endregion

                else
                {
                    //handler.HandleQuery(request);
                }
            }
            catch
            {
            }
        }
コード例 #3
0
        public void Process(RequestInfo requestInfo)
        {
            MessagePacket messagePacket = requestInfo.MessagePacket;

            try
            {
                if (messagePacket.MessageHeader.MessageType == MessageType.Noraml)
                {
                    this.handler.Handle(messagePacket.MessageHeader.SourceUserID, messagePacket.ContractID, messagePacket.BodyContent);
                }
                else
                {
                    #region Blob
                    if (messagePacket.MessageHeader.MessageType == MessageType.Blob)
                    {
                        BlobContract blobContract = BlobContract.Parser.ParseFrom(messagePacket.BodyContent);
                        string       key          = messagePacket.MessageHeader.SourceUserID + blobContract.BlobID.ToString();
                        BlobItem     blobItem     = this.hotDic.Get(key);
                        if (blobItem == null)
                        {
                            blobItem = new BlobItem();
                            this.hotDic.Add(key, blobItem);
                        }
                        blobItem.Add(blobContract.FragmentIndex, blobContract.Fragment);
                        bool isLast = blobContract.IsLast;
                        if (isLast)
                        {
                            BlobItem     andRemove    = this.hotDic.GetAndRemove(key);
                            MemoryStream memoryStream = new MemoryStream();
                            foreach (KeyValuePair <int, ByteString> current in andRemove)
                            {
                                current.Value.WriteTo(memoryStream);
                            }
                            byte[] info = memoryStream.ToArray();
                            memoryStream.Dispose();
                            this.handler.Handle(messagePacket.MessageHeader.SourceUserID, messagePacket.ContractID, info);
                        }
                    }
                    #endregion

                    #region Ack
                    else
                    {
                        if (messagePacket.MessageHeader.MessageType == MessageType.Ack_Req)
                        {
                            this.ResponseAck(requestInfo.Channel, messagePacket);
                            this.handler.Handle(messagePacket.MessageHeader.SourceUserID, messagePacket.ContractID, messagePacket.BodyContent);
                        }
                        else
                        {
                            if (messagePacket.MessageHeader.MessageType == MessageType.Ack_Resp ||
                                messagePacket.MessageHeader.MessageType == MessageType.Query_Resp ||
                                messagePacket.MessageHeader.MessageType == MessageType.LoginResp)
                            {
                                if (this.messageBag.ContainsKey(messagePacket.MessageHeader.MessageID))
                                {
                                    this.messageBag[messagePacket.MessageHeader.MessageID].SetResult(messagePacket.BodyContent);
                                }
                            }
                            else
                            {
                                if (messagePacket.MessageHeader.MessageType == MessageType.Query_Req)
                                {
                                    byte[] body = this.handler.HandleQuery(messagePacket.MessageHeader.SourceUserID, messagePacket.ContractID, messagePacket.BodyContent);
                                    this.ResponseQuery(requestInfo.Channel, messagePacket, body);
                                }
                            }
                        }
                    }
                    #endregion
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }