java - Netty:如何将查询字符串与 websocket 一起使用?

标签 java websocket netty

这是我的ChannelInitializer#initChannel的代码片段

    ChannelPipeline p = ch.pipeline();

    p.addLast(new HttpServerCodec()         
    .addLast(new HttpObjectAggregator(65536))
    .addLast( new LoggingHandler(LogLevel.INFO))
    .addLast(new WebSocketServerProtocolHandler("/chat"))
    .addLast(new TextWebSocketFrameToChatMessageDecoder())
    .addLast(new UserAccessHandler())

它可以通过ws://mydomain/chat接受,现在我想解析这样的查询字符串ws://mydomain/chat?accesskey=hello >

我已经查找了WebSocketServerProtocolHandler,但我找不到如何获取查询字符串。

如何获取(或解析)查询字符串? 感谢您的帮助。

最佳答案

重写方法:userEventTriggered 并处理事件 HandshakeComplete。

参见WebSocketServerProtocolHandshakeHandler

Netty 4.1

public class TextWebSocketFrameToChatMessageDecoder extends SimpleChannelInboundHandler<WebSocketFrame> {
    public final static AttributeKey<Map<String,String>> RequestParams = AttributeKey.valueOf("request.params");

    @Override
    public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
        if(evt instanceof HandshakeComplete){
            HandshakeComplete handshake = (HandshakeComplete)evt;

            //http request header
            HttpHeaders headers = handshake.requestHeaders();

            //http request uri: /chat?accesskey=hello
            String              uri    = handshake.requestUri(); 

            //TODO: parse uri parameters to map ...
            Map<String, String> params ;

            //put to channel context
            ctx.channel().attr(RequestParams).set(params);

        }else{
            ctx.fireUserEventTriggered(evt);
        }
    }

    @Override
    protected void channelRead0(ChannelHandlerContext ctx, WebSocketFrame frame) throws Exception {
        //on message
        if (frame instanceof TextWebSocketFrame) {
            Map<String, String> params    = ctx.channel().attr(RequestParams).get();
            String              accesskey = params.get("accesskey");
            System.out.println( accesskey ); //hello
        } else {
            System.out.println( "Unsupported frame type: " + frame.getClass().getName() );
        }        
    }
}

关于java - Netty:如何将查询字符串与 websocket 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38895443/

相关文章:

java - opencv - 匹配模板

java - 获取struts :url includeparams to work on jboss when deploying as ROOT. war

javascript - 在另一个浏览器中从网络套接字接收返回的消息

java - Netty IO发送消息给客户端

java - 如何对字符串流中的每个字符串进行排序?

java - 如何加入现有的 SwingWorker

java - Spring Boot 端点 + webSocket

node.js - Socket.IO 在 Google Chrome 43.0.2357.65 上停止工作

java - 使用 GSon 从 JSon 转换为多个未知的 java 对象类型

java - 如何修复 Android Studio 中的 ChannelException?