netty实现websocket通信

2023-12-13 23:16:56

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长连接持续收发对应消息报文。

文章来源:https://blog.csdn.net/sinat_16493273/article/details/134871226
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。