netty同时实现http与websocket通讯

本文讲述了在业务需求下,如何使用Netty同时处理HTTP与WebSocket通信的问题。作者在尝试过程中遇到了各种困难,包括数据破坏、编码解码混乱等。最终找到了正确的解决方案,即利用HTTP长连接处理物理机与服务器的连接,WebSocket处理浏览器与服务器的连接,二者共享相同的编码解码规则。文中还提及了pipeline配置和核心处理类的设计思路。
摘要由CSDN通过智能技术生成

由于业务需求需要将硬件客户端的持续数据流传到netty服务器,然后返回通过websocket将服务器拿到的数据返回到h5页面

必须要说的是在百度找相关技术博客资料的时候踩了太多太多的坑了,真搞不懂有些人,自己都不会把别人的博客一顿乱转,一篇相同的技术博客可以看到七八次,复制别人的就算了不是少这个就是少那个连抄都抄不好,rnmmp!

之前的思路
1 是在服务端的pipeline上面分别加入socket通讯
websocket 的处理类,但是前面的数据处理类会对其他协议的数据造成破坏,比如:

pipeline.addLast(new HttpServerCodec());// Http消息编码解码
pipeline.addLast(new HttpObjectAggregator(64*1024));
pipeline.addLast(new ChunkedWriteHandler());

我在这添加http的编码解码类,那么socket数据通过的时候就会被破坏而不能在后面的处理类中被处理。

2 第二个思路是在pipeline的第一个处理类上便添加一个路由处理类

pipeline.addLast(new Routing());
 @Override
    protected void channelRead0(ChannelHandlerContext ctx, Object msg) throws Exception {
        // TODO Auto-generated method stub
        ByteBuf in = (ByteBuf) msg;
        byte[] req = new byte[in.readableBytes()];
        in.readBytes(req);
        String body = new String(req, "UTF-8");
        String str[]=body.split(" ");
        System.out.println("body====="+body);
        System.out.println("Msg====="+msg);
        //满足判断条件则进行再加码传递到后面的处理类
        if(!(isNum(str[0]))){
             ByteBuf Message;
            byte[] r = body .getBytes();
            Message = Unpooled.buffer(r.length);
            Message.writeBytes(r);
            System.out.println("websocket");
        //传递到后面的处理类
            ctx.fireChannelRead(Message);
        }
    }

大致思路就是继承SimpleChannelInboundHandler类重写channelRead0方法
现将接受到的bytebuf数据进行解码,转换成字符串的形式后再对字符串的特殊标识进行区分,比如http请求的**“get”,“post”**websocket的
“/ws” 如果满足条件就将解码的数据在加码传到后面的处理类,(因为之前的缓存数据已经被解码了如果不进行再加码就会报计数器错误),这个方法 几乎成功了,但在处理websocket请求的时会乱码!mmp!

所以正确的方法是用http长连接处理物理机与服务端的连接,用websocket处理浏览器与服务端的连接
因为websocket是http请求的握手升级,他们可以共用一套编码解码规则
然后再到自己定义的处理类中区分处理不同协议的处理方法

pipeline责任链

public class WebsocketServerInitializer extends
        ChannelInitializer<SocketChannel> {
   
    @Override
    public void initChannel(SocketChannel ch) throws Exception {
        ChannelPipeline pipeline = ch.pipeline();
        //对ByteBuf数据流进行处理,转换成http的对象
        /*pipeline.addLast(new ServerHandler());*/
    /*  pipeline.addLast(new Routing());*/
        pipeline.addLast(new HttpServerCodec());// Http消息编码解码
        pipeline.addLast(new HttpObjectAggregator(64*1024));
        pipeline.addLast(new ChunkedWriteHandler());
        /*pipeline.addLast(new HttpRequestHandler("/ws"));
        pipeline.addLast(new WebSocketServerProtocolHandler("/ws"));
        pipeline.addLast(new ServerHandler());*/
        pipeline.addLast(new SocketHandel());//自定义处理类
    }
}

核心处理类

public class SocketHandel extends BaseHttpHandler {
   
    private WebSocketServerHandshaker handshaker;
    
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值