缺少升级:在netty 4.x上同时提供http和ws

编程入门 行业动态 更新时间:2024-10-27 18:19:44
本文介绍了缺少升级:在netty 4.x上同时提供http和ws的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我正在netty上写一个聊天应用程序。

I'm writing a chat application on netty.

我试图同时提供 HTTP 和 WS ,但http响应只是这些消息

I tried to serve both HTTP and WS, but http responses is only these message

不是WebSocket握手请求:缺少升级

not a WebSocket handshake request: missing upgrade

这是我的代码片段。

在InitChannel方法

in InitChannel method

p.addLast(new HttpServerCodec()) .addLast(new HttpObjectAggregator(65536)) .addLast( new LoggingHandler(LogLevel.INFO)) .addLast(new WebSocketServerProtocolHandler("/chat"), new WsUserAcceptHandler(), new WsChatServerHandler()) .addLast(new HttpStaticFileHandler("/", ChatServer.index)) .addLast(new HttpNotFoundHandler());

和在channelRead上,WsUserAcceptHandler,WsChatHandler只处理TextWebSocketFrame,其他都是 ctx.fireChannelRead(msg)

and on channelRead, both WsUserAcceptHandler, WsChatHandler handles only TextWebSocketFrame, and the others are ctx.fireChannelRead(msg)

WsUserAcceptHandler

WsUserAcceptHandler

@Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { System.out.println("WsUserAcceptHandler#channelRead :" + msg.getClass()); if (msg instanceof TextWebSocketFrame) { TextWebSocketFrame tMsg = (TextWebSocketFrame) msg; ChatMessage chatMsg = ChatMessage.parse(tMsg.text()); if (chatMsg.getCommand().equals("CONN")) { SqlSession sqlSession = SqlSessionFactoryManager .getSqlSession(); User u = new User(); ChatRoom roomInfo = new ChatRoom(); try { u.setUserSessionkey(chatMsg.getSessionKey()); UserMapper userMapper = sqlSession .getMapper(UserMapper.class); u = userMapper.get(u); ChatInfoMapper chatInfoMapper = sqlSession .getMapper(ChatInfoMapper.class); roomInfo = chatInfoMapper.getRoomInfo(chatMsg.getRoomNo()); } catch (Exception e) { } finally { sqlSession.close(); } if (u != null) { System.out.println("userInfo"); System.out.println(u.toString()); AttrKeys attrs = AttrKeys.getInstance(); ctx.channel().attr(attrs.sessionKey()) .set(u.getUserSessionkey()); ctx.channel().attr(attrs.userInfo()).set(u); currClients.registerUserChannelGroup( String.valueOf(chatMsg.getRoomNo()), ctx.channel()); ChatDataMapper cdm = new ChatDataMapper(); List<ChatMessage> latests = cdm.gets(chatMsg.getRoomNo(), 20); HashMap<String, Object> map = new HashMap<String, Object>(); map.put("recentMessages", latests); map.put("roomInfo", roomInfo); JsonResultSet<HashMap<String, Object>> res = new JsonResultSet<HashMap<String, Object>>(); res.setResultCode("S0000"); res.setResultMessage("Success"); res.setCommand(chatMsg.getCommand()); res.setResult(map); System.out.println(res.toJsonString()); TextWebSocketFrame outputMsg = new TextWebSocketFrame( res.toJsonString()); ctx.writeAndFlush(outputMsg); } else { ctx.flush(); } // ctx.writeAndFlush(outputMsg); } else if (chatMsg.getCommand().equals("DISCONN")) { ctx.channel().attr(sessionKeyAttr).get(); currClients.unregisterUserChannelGroup( String.valueOf(chatMsg.getRoomNo()), ctx.channel()); ctx.fireChannelInactive(); } } ctx.fireChannelRead(msg); // if not instance of TextWebsocketFrame }

WsChatServerHandler

WsChatServerHandler

@Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { System.out.println("WsChatServerHandler##channelRead :" + msg.getClass()); if(msg instanceof TextWebSocketFrame){ ChatMessage chatMsg = ChatMessage.parse(((TextWebSocketFrame) msg).text()); // chatMsg.setC_user_nm(ctx.channel().attr(sessionKeyAttr).get() ); if(chatMsg.getCommand().equals("TEXT")){ ChannelGroup roomUsers = currClients.getUserChannelGroup(String.valueOf(chatMsg.getRoomNo ())); AttrKeys attrs = AttrKeys.getInstance(); User u = ctx.channel().attr(attrs.userInfo()).get(); JsonResultSet<ChatMessage> res = new JsonResultSet<ChatMessage>(); res.setResultCode("S0000"); res.setResultMessage("Success"); res.setCommand(chatMsg.getCommand()); chatMsg.setSessionKey(null); chatMsg.setCommand(null); chatMsg.setSeq(ChatServer.nextChatDataSeq()); chatMsg.setUserSeq(u.getUserSeq()); chatMsg.setUserNm(u.getUserNm()); chatMsg.setUserType(u.getUserType()); chatMsg.setUserThumb(StaticVar.default_img_url+u.getUserThumb()+"&imgMode=origin"); chatMsg.setUserPic(StaticVar.default_img_url+u.getUserPic()+"&imgMode=thumb"); ChatDataMapper mapper = new ChatDataMapper(); mapper.put(chatMsg); System.out.println(chatMsg.toString()); res.setResult(chatMsg); TextWebSocketFrame outputMsg = new TextWebSocketFrame(res.toJsonString()); sendPush(chatMsg, String.valueOf(chatMsg.getRoomNo())); // gcmTest(chatMsg); roomUsers.writeAndFlush(outputMsg); } else if(chatMsg.getCommand().equals("MORE")){ } } else { ctx.fireChannelRead(msg); } }

推荐答案

我解决了。这是Netty版本问题。

I solved. It was Netty version problem.

我在Netty 4.1.0.CR6之前使用过然后我尝试在版本和4.0.0之后更改它然后我的问题就消失了。

I used before Netty 4.1.0.CR6 then I tried changing both after version and 4.0.0 then my problem is gone.

更多推荐

缺少升级:在netty 4.x上同时提供http和ws

本文发布于:2023-11-17 17:05:19,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1610399.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:netty   ws   http

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!