缺少升级:在netty 4.x上同时提供http和ws [英] missing upgrade : Serve both http and ws on netty 4.x

查看:526
本文介绍了缺少升级:在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的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆