netty实现websocket通信

websocket是基于http的,所以server端在上一篇实现http协议服务基础上在pipeline里再添加一个WebSocketServerProtocolHandler处理器即可。WebSocketServerProtocolHandler需要指定一个路径参数,用来客户端连接使用。

服务端
EventLoopGroup bossGroup = new NioEventLoopGroup(1);
EventLoopGroup workGroup = new NioEventLoopGroup(4);
ServerBootstrap bootstrap = new ServerBootstrap().group(bossGroup,workGroup)
        .channel(NioServerSocketChannel.class)
        .childHandler(new ChannelInitializer<SocketChannel>() {
            @Override
            protected void initChannel(SocketChannel ch) throws Exception {
                ChannelPipeline p = ch.pipeline();     
                p.addLast(new HttpServerCodec());
                p.addLast(new HttpObjectAggregator(65536));
                
                p.addLast(new WebSocketServerProtocolHandler("/chat"));
                
                p.addLast(new CustomeWebSocketFrameHandler());
            }
        });
bootstrap.bind(8080).sync();

CustomeWebSocketFrameHandler是自定义的handler,将用他来进行websocket消息的处理。在WebSocketServerProtocolHandler处理后,消息报文可以用WebSocketFrame类型进行接收。WebSocketFrame是一个抽象类。有PingWebSocketFrame、PongWebSocketFrame、CloseWebSocketFrame、TextWebSocketFrame、BinaryWebSocketFrame等几个常见子类。其中ping、ping和close在WebSocketServerProtocolHandler已经处理好了,在自定义的handler里只要处理TextWebSocketFrame和BinaryWebSocketFrame就好了。

CustomeWebSocketFrameHandler重写channelRead0方法处理接收消息

protected void channelRead0(ChannelHandlerContext ctx, WebSocketFrame msg) throws Exception {
    if(msg instanceof TextWebSocketFrame){
        TextWebSocketFrame frame = (TextWebSocketFrame) msg;
        System.out.println("接收消息:"+frame.text());
    }else if(msg instanceof BinaryWebSocketFrame){
        BinaryWebSocketFrame frame = (BinaryWebSocketFrame) msg;
        String info = frame.content().toString(StandardCharsets.UTF_8);
        System.out.println("接收到内容:"+info);
    }else{
        //TODO
        System.out.println(msg);
    }
    
    Thread.sleep(1000);
    String response = "Hello,"+ LocalDateTime.now().toString();
    ctx.channel().writeAndFlush(new TextWebSocketFrame(response));
}

这样服务端的代码就简单准备好了

客户端

客户端使用js来进行收发消息测试

 <script>
     var socket = new WebSocket("ws://localhost:8080/chat");
     socket.onopen = function () {
         console.log('connection');
         socket.send("hello1");
     }
     socket.onclose = function () {
         console.log('close');
     }
     socket.onmessage = function (event) {
         console.log("message:"+event.data);
socket.send("收到你的消息:"+event.data)
     }
     setTimeout(function () {
         if(socket.readyState === WebSocket.OPEN ){
             socket.send("hello");
         }
     },500);

 </script>

分别启动服务端可客户端测试,就能互相收到对应的消息进行处理了。这里只是简单的进行收发测试。可以根据具体场景来进行修改。如对话聊天服务端可以只作为消息中转,多个客户端连接。做监控,服务端可以持续push消息到客户端,直播互动等等场景。使用websocket长连接持续收发对应消息报文。

  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值