2016-04-05 4 views
1

私はnettyでチャットアプリケーションを作成しています。ここでアップグレードが不足しています:nettyでhttpとwsの両方を提供してください。4.x

私のコードスニペットでアップグレード行方不明:

は、私はこれらのメッセージ

ないのWebSocketハンドシェイク要求の両方HTTPWSが、HTTPレスポンスを提供しようとしました。

InitChannel方法で

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

答えて

0

私は解決しました。 Nettyバージョンの問題でした。

私はNetty 4.1.0.CR6の前に使っていましたが、バージョンと4.0.0の両方を変更してみましたが、問題はなくなりました。

関連する問題