由于业务需求需要将硬件客户端的持续数据流传到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;