1
私はnettyでチャットアプリケーションを作成しています。ここでアップグレードが不足しています:nettyでhttpとwsの両方を提供してください。4.x
私のコードスニペットでアップグレード行方不明:
は、私はこれらのメッセージないのWebSocketハンドシェイク要求の両方
InitChannel方法でHTTP
とWS
が、HTTPレスポンスを提供しようとしました。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)
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
あります3210