netty可以获取用户绑定状态吗
2016-08-02
展开全部
nettyv3.9.4websocket连接建立前,客户端需要与服务器进行握手(http协议)确认websocket连接,也就是说在处理websocket请求前,必需要处理一些http请求。websocket到现在为止,已经有多个版本,netty有相应的对应类,这部分处理一般不需要人工干预。如果运行正常的话,会在页面的文本框中显示1-20记数。可以通过firefox或chrome的开发人员工具,显看浏览器与服务器的交互。主要是HttpServerChannelHandler2,加了些注释和少量debug代码。?123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105packageorg.sl.demo.httpserver1;importjava.util.List;importjava.util.Map;importorg.jboss.netty.channel.Channel;importorg.jboss.netty.channel.ChannelHandlerContext;importorg.jboss.netty.channel.MessageEvent;importorg.jboss.netty.channel.SimpleChannelHandler;importorg.jboss.netty.handler.codec.http.DefaultHttpResponse;importorg.jboss.netty.handler.codec.http.HttpHeaders;importorg.jboss.netty.handler.codec.http.HttpMethod;importorg.jboss.netty.handler.codec.http.HttpRequest;importorg.jboss.netty.handler.codec.http.HttpResponseStatus;importorg.jboss.netty.handler.codec.http.HttpVersion;importorg.jboss.netty.handler.codec.http.websocketx.CloseWebSocketFrame;importorg.jboss.netty.handler.codec.http.websocketx.PingWebSocketFrame;importorg.jboss.netty.handler.codec.http.websocketx.PongWebSocketFrame;importorg.jboss.netty.handler.codec.http.websocketx.TextWebSocketFrame;importorg.jboss.netty.handler.codec.http.websocketx.WebSocketFrame;importorg.jboss.netty.handler.codec.http.websocketx.WebSocketServerHandshaker;importorg.jboss.netty.handler.codec.http.websocketx.WebSocketServerHandshakerFactory;publicclassHttpServerChannelHandler2extendsSimpleChannelHandler{publicstaticbooleandebug=true;@OverridepublicvoidmessageReceived(ChannelHandlerContextctx,MessageEvente){Channelch=e.getChannel();Objectmsg=e.getMessage();if(debug){System.out.println("---------------");System.out.println("message:"+msg.getClass());}//虽然是websocket,但在建立websocket连接前,先进行http握手,所以,这时也要处理http请求//在http握手完成后,才是websocket下的通信if(msginstanceofHttpRequest){processHttpRequest(ch,(HttpRequest)msg);}elseif(msginstanceofWebSocketFrame){processWebsocketRequest(ch,(WebSocketFrame)msg);}else{//未处理的请求类型}}//这个方法://1.完成websocket前的http握手//2.屏蔽掉非websocket握手请求voidprocessHttpRequest(Channelchannel,HttpRequestrequest){HttpHeadersheaders=request.headers();if(debug){List>ls=headers.entries();for(Map.Entryi:ls){System.out.println("header"+i.getKey()+":"+i.getValue());}}//屏蔽掉非websocket握手请求//只接受httpGET和headers['Upgrade']为'websocket'的http请求if(!HttpMethod.GET.equals(request.getMethod())||!"websocket".equalsIgnoreCase(headers.get("Upgrade"))){DefaultHttpResponseresp=newDefaultHttpResponse(HttpVersion.HTTP_1_1,HttpResponseStatus.BAD_REQUEST);channel.write(resp);channel.close();return;}WebSocketServerHandshakerFactorywsShakerFactory=newWebSocketServerHandshakerFactory("ws://"+request.headers().get(HttpHeaders.Names.HOST),null,false);WebSocketServerHandshakerwsShakerHandler=wsShakerFactory.newHandshaker(request);if(null==wsShakerHandler){//无法处理的websocket版本wsShakerFactory.sendUnsupportedWebSocketVersionResponse(channel);}else{//向客户端发送websocket握手,完成握手//客户端收到的状态是101sitchingprotocolwsShakerHandler.handshake(channel,request);}}//websocket通信voidprocessWebsocketRequest(Channelchannel,WebSocketFramerequest){if(requestinstanceofCloseWebSocketFrame){channel.close();}elseif(requestinstanceofPingWebSocketFrame){channel.write(newPongWebSocketFrame(request.getBinaryData()));}elseif(requestinstanceofTextWebSocketFrame){//这个地方可以根据需求,加上一些业务逻辑TextWebSocketFrametxtReq=(TextWebSocketFrame)request;if(debug){System.out.println("txtReq:"+txtReq.getText());}//向ws客户端发送多个响应for(inti=1;i
2016-08-02
展开全部
可以
1.创建NioEventLoopGroup线程池
2. 创建NioServerSocketChannel,并初始化,注册时没有直接把SelectionKey.OP_ACCEPT注册上,只是注册了一个0,把AbstractNioChannel作为attachment绑定到selectionkey了,但是传递了OP_ACCEPT到AbstractNioChannel的readInterestOp属性。
3. 初始化Pipeline以及相关的ChannelHandlerContext数据结构
4. 在读数据开始时,根据AbstractNioChannel的readInterestOp的值,把SelectionKey.OP_ACCEPT真正注册上。selectionKey.interestOps(interestOps | readInterestOp);
5. 调用ServerSocketChannel完成端口绑定。
1.创建NioEventLoopGroup线程池
2. 创建NioServerSocketChannel,并初始化,注册时没有直接把SelectionKey.OP_ACCEPT注册上,只是注册了一个0,把AbstractNioChannel作为attachment绑定到selectionkey了,但是传递了OP_ACCEPT到AbstractNioChannel的readInterestOp属性。
3. 初始化Pipeline以及相关的ChannelHandlerContext数据结构
4. 在读数据开始时,根据AbstractNioChannel的readInterestOp的值,把SelectionKey.OP_ACCEPT真正注册上。selectionKey.interestOps(interestOps | readInterestOp);
5. 调用ServerSocketChannel完成端口绑定。
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询