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); } }
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); }
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); }
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); }
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); }
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)); }