Пример #1
0
        protected override void Decode(IChannelHandlerContext ctx, IHttpRequest msg, List <object> output)
        {
            try
            {
                string uri = msg.Uri;
                switch (uri)
                {
                case "/handshake":
                    var connectionInfo = channelGroup.FindConnectionInfo(ctx.Channel);
                    if (connectionInfo == null)
                    {
                        channelGroup.Add(new ConnectionInfo(ctx.Channel, this.Options));
                    }
                    ctx.Channel.Pipeline.FireUserEventTriggered(new HandShakeEvent());
                    break;

                default:
                    var message = messageFactory.Parse(uri);
                    if (message != null)
                    {
                        output.Add(message);
                    }
                    break;
                }
            }
            finally
            {
                ReferenceCountUtil.Release(msg);
            }
        }
Пример #2
0
        protected override void Decode(IChannelHandlerContext ctx, DefaultRequestMessagePacket msg, List <object> output)
        {
            var connectionInfo = channelGroup.FindConnectionInfo(ctx.Channel);

            if (connectionInfo == null || msg.ClientId <= 0 || string.IsNullOrEmpty(msg.SessionId) || connectionInfo.ClientId != msg.ClientId || connectionInfo.SessionId != msg.SessionId)
            {
                ctx.CloseAsync();
                return;
            }

            switch (msg.ContractId)
            {
            case (int)ContractType.HandShake:
                //握手,实际上在childchannel永远不会接受到握手消息
                break;

            case (int)ContractType.HeartBeat:
                //心跳直接忽略
                break;

            default:
                var o = blowFish.DecryptECB(msg.Sign);
                if (o == GetInputKey(msg))
                {
                    output.Add(msg);
                }
                break;
            }
        }
        protected override void ChannelRead0(IChannelHandlerContext ctx, IChannel child)
        {
            var connectionInfo = channelGroup.FindConnectionInfo(child);

            if (connectionInfo == null)
            {
                channelGroup.Add(new ConnectionInfo(child, this._options));
            }
            ctx.FireChannelRead(child);
        }
Пример #4
0
        public async Task Handler <I>(IChannel channel, I msg) where I : IRequestMessage
        {
            OwinListenerContext owinContext = null;

            var     defaultMsg     = msg as DefaultRequestMessagePacket;
            AppFunc _appFunc       = channel.GetAttribute <AppFunc>(appKey).Get();
            var     connectioninfo = channelGroup.FindConnectionInfo(channel);

            try
            {
                owinContext = new OwinListenerContext(connectioninfo, msg);
                PopulateServerKeys(owinContext.Environment);

                await _appFunc(owinContext.Environment);

                owinContext.End();
                owinContext.Dispose();
            }
            catch (Exception ex)
            {
                owinContext.Environment[Constants.ResponseStatusCode] = HttpStatusCode.InternalServerError;

                if (owinContext != null)
                {
                    owinContext.End(ex);
                    owinContext.Dispose();
                }

                this.logger.LogError(ex, "消息处理错误");
            }

            var statusCode = (int)owinContext.Environment[Constants.ResponseStatusCode];

            byte[] responseBody = null;
            if (statusCode == (int)HttpStatusCode.OK)
            {
                responseBody = (owinContext.Environment[Constants.ResponseBody] as ListenerStreamWrapper).ToArray();
            }

            var response = new DefaultResponseMessagePacket(
                statusCode,
                defaultMsg.ContractId,
                defaultMsg.Id,
                responseBody
                );
            var headers = owinContext.Environment[Constants.ResponseHeaders] as ResponseHeadersDictionary;

            foreach (var item in headers)
            {
                response.Headers.Add(item.Key, item.Value.FirstOrDefault());
            }

            await channel.WriteAndFlushAsync(response);
        }
Пример #5
0
 public override void UserEventTriggered(IChannelHandlerContext context, object evt)
 {
     //心跳超时状态
     if (evt is HeartBeatTimeoutEvent)
     {
         var eventState = evt as HeartBeatTimeoutEvent;
         messageHandler.HandlerTimeout(eventState.Channel);
     }
     else if (evt is HandShakeEvent)
     {
         //当客户端连接成功后.会触发握手事件.然后主动向客户端推送sid和clienid
         var response = messageFactory.CreateHandShake(channelGroup.FindConnectionInfo(context.Channel));
         context.Channel.WriteAndFlushAsync(response);
     }
     context.FireUserEventTriggered(evt);
 }
Пример #6
0
        protected override void ChannelRead0(IChannelHandlerContext ctx, DatagramPacket msg)
        {
            var message = messageFactory.Parse(msg.Content);

            if (message == null || int.Parse(message.Headers.Get(Constants.Headers.ContractId)) != (int)ContractType.HandShake)
            {
                return;
            }
            IChannel child          = new UdpSocketDatagramChannel(ctx.Channel, msg.Sender);
            var      connectionInfo = channelGroup.FindConnectionInfo(child);

            if (connectionInfo == null)
            {
                channelGroup.Add(new ConnectionInfo(child, this._options));
            }
            ctx.FireChannelRead(child);
        }
Пример #7
0
        protected override void Decode(IChannelHandlerContext ctx, IFullHttpRequest req, List <object> output)
        {
            // Handle a bad request.
            if (!req.Result.IsSuccess)
            {
                SendHttpResponse(ctx, req, new DefaultFullHttpResponse(Http11, BadRequest));
                return;
            }

            // Allow only GET methods.
            if (!Equals(req.Method, HttpMethod.Get))
            {
                SendHttpResponse(ctx, req, new DefaultFullHttpResponse(Http11, Forbidden));
                return;
            }

            // Handshake
            var wsFactory = new WebSocketServerHandshakerFactory(
                GetWebSocketLocation(req), null, true, 5 * 1024 * 1024);
            var handshaker = wsFactory.NewHandshaker(req);

            if (handshaker == null)
            {
                WebSocketServerHandshakerFactory.SendUnsupportedVersionResponse(ctx.Channel);
            }
            else
            {
                handshaker.HandshakeAsync(ctx.Channel, req);
            }

            ctx.GetAttribute(wshsKey).Set(handshaker);
            var connectionInfo = channelGroup.FindConnectionInfo(ctx.Channel);

            if (connectionInfo == null)
            {
                channelGroup.Add(new ConnectionInfo(ctx.Channel, this.Options));
            }
            ctx.Channel.Pipeline.FireUserEventTriggered(new HandShakeEvent());
        }
 public static int FindClientID(this IConnectionChannelGroup group, IChannel channel)
 {
     return(group.FindConnectionInfo(channel.Id).ClientId);
 }
 public static ConnectionInfo FindConnectionInfo(this IConnectionChannelGroup group, IChannel channel)
 {
     return(group.FindConnectionInfo(channel.Id));
 }