Beispiel #1
0
 public NettyNetwork(string address, int port)
 {
     this.Address = address;
     this.Port    = port;
     this.Id      = IdCreator.CreateNetworkId();
     MessageBinder.Bind <HeartbeatAdapter>(HEART_BEAT_RPC_FLAG);
 }
Beispiel #2
0
        public override void ChannelRead(IChannelHandlerContext context, object message)
        {
            var byteBuffer = message as IByteBuffer;

            if (byteBuffer == null)
            {
                return;
            }

            try
            {
                var messageId  = byteBuffer.GetInt(0);
                var rpcId      = byteBuffer.GetInt(4);
                var senderType = (SenderType)byteBuffer.GetByte(8);

                const int headerSize = sizeof(int) * 2 + sizeof(byte);
                var       messageStr = byteBuffer.ToString(byteBuffer.ReaderIndex + headerSize, byteBuffer.ReadableBytes - headerSize, Encoding.UTF8);

                if (senderType == SenderType.FeedbackSender)
                {
                    var callContext = RemoveCallAwaiter(context, rpcId);
                    if (callContext == null)
                    {
                        return;
                    }

                    var messageType = callContext.MessageType;
                    if (messageType == typeof(string))
                    {
                        var messageObj = messageStr;
                        callContext.SetResult(messageObj);
                    }
                    else
                    {
                        try
                        {
                            var messageObj = JsonConvert.DeserializeObject(messageStr, messageType);
                            callContext.SetResult(messageObj);
                        }
                        catch (Exception ex)
                        {
                            callContext.SetResult(null);
                            Console.WriteLine($"MessageId:{messageId} MessageType:{messageType.Name} ReceiveMessage:{messageStr} Exception:{ex}");
                        }
                    }
                }
                else
                {
                    var channelContext = DequeueChannelContext();
                    channelContext.SetContext(this, context, messageId, rpcId, senderType);

                    var messageType = MessageBinder.GetMessageType(messageId);
                    var adapter     = MessageBinder.GetAdapter(messageId);
                    if (messageType == typeof(string))
                    {
                        var messageObj = messageStr;
                        adapter.DispatchAdapter(channelContext, messageObj);
                    }
                    else
                    {
                        try
                        {
                            var messageObj = JsonConvert.DeserializeObject(messageStr, messageType);
                            adapter.DispatchAdapter(channelContext, messageObj);
                        }
                        catch (Exception ex)
                        {
                            Console.WriteLine($"MessageId:{messageId} MessageType:{messageType.Name} ReceiveMessage:{messageStr} Exception:{ex}");
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
                DisconnectAsync(context).Wait();
            }
            finally
            {
                try
                {
                    ReferenceCountUtil.Release(byteBuffer);
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex);
                }
            }
        }