基于 Netty 5.0 实现 WebSocket 的案例解析!

举报
喵手 发表于 2025/03/19 16:38:47 2025/03/19
【摘要】 开篇语哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛  今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。  我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,...

开篇语

哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛

  今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。

  我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。

小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!

前言

  随着现代 web 应用对实时通信的需求增加,WebSocket 作为一种全双工通信协议,已经成为前后端实时交互的理想选择。Netty 作为一个高性能的网络通信框架,支持 WebSocket 协议,因此,我们可以使用 Netty 来实现 WebSocket 服务。本文将介绍如何基于 Netty 5.0 实现一个 WebSocket 服务器,示例中会包括详细的代码和解析,帮助你快速掌握如何在 Netty 中使用 WebSocket。

1. WebSocket 简介

WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。与传统的 HTTP 协议不同,WebSocket 协议在客户端和服务器之间建立起一个持续的连接,客户端和服务器可以随时互相发送数据,非常适合实时应用,如即时消息、在线游戏、股票实时行情等。

2. Netty 和 WebSocket

Netty 是一个基于事件驱动的网络应用程序框架,提供了高度可扩展的网络服务,能够支持多种协议的实现,包括 HTTP 和 WebSocket。Netty 在 WebSocket 协议的实现上非常高效,适合于处理大规模并发的实时通信。

3. 项目准备

首先,确保你的项目中已经添加了 Netty 5.0 的依赖。如果是使用 Maven 构建项目,可以在 pom.xml 文件中添加以下依赖:

<dependencies>
    <!-- Netty 依赖 -->
    <dependency>
        <groupId>io.netty</groupId>
        <artifactId>netty-all</artifactId>
        <version>5.0.0.Final</version>
    </dependency>
</dependencies>

如果你使用 Gradle 构建项目,可以添加如下依赖:

dependencies {
    implementation 'io.netty:netty-all:5.0.0.Final'
}

4. 创建 WebSocket 服务器

接下来,我们通过创建一个简单的 WebSocket 服务器,来展示如何使用 Netty 处理 WebSocket 连接。

4.1 创建 WebSocket 服务器启动类

import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.Channel;
import io.netty.channel.ChannelFuture;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.handler.codec.http.HttpServerCodec;
import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler;
import io.netty.handler.stream.StreamingFileRegion;

public class WebSocketServer {

    private final int port;

    public WebSocketServer(int port) {
        this.port = port;
    }

    public void start() throws InterruptedException {
        EventLoopGroup bossGroup = new NioEventLoopGroup();
        EventLoopGroup workerGroup = new NioEventLoopGroup();
        try {
            ServerBootstrap b = new ServerBootstrap();
            b.group(bossGroup, workerGroup)
             .channel(NioServerSocketChannel.class)
             .childHandler(new WebSocketServerInitializer());

            // Bind and start to accept incoming connections
            ChannelFuture f = b.bind(port).sync();
            f.channel().closeFuture().sync();
        } finally {
            workerGroup.shutdownGracefully();
            bossGroup.shutdownGracefully();
        }
    }

    public static void main(String[] args) throws InterruptedException {
        new WebSocketServer(8080).start();
    }
}

4.2 创建 WebSocket 服务器初始化器

WebSocketServerInitializer 用于初始化服务器管道配置,处理 WebSocket 握手、消息处理等。

import io.netty.channel.ChannelInitializer;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.codec.http.HttpServerCodec;
import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler;
import io.netty.handler.codec.http.websocketx.WebSocketFrame;
import io.netty.channel.ChannelPipeline;

public class WebSocketServerInitializer extends ChannelInitializer<SocketChannel> {
    @Override
    protected void initChannel(SocketChannel ch) throws Exception {
        ChannelPipeline pipeline = ch.pipeline();
        
        // HTTP 编解码器,用于处理 HTTP 请求和响应
        pipeline.addLast(new HttpServerCodec());

        // WebSocket 协议处理器,处理 WebSocket 握手和消息传递
        pipeline.addLast(new WebSocketServerProtocolHandler("/ws"));
        
        // 处理 WebSocket 数据的业务逻辑
        pipeline.addLast(new WebSocketFrameHandler());
    }
}

4.3 WebSocket 消息处理类

WebSocketFrameHandler 类用于处理 WebSocket 数据的读取、写入以及处理不同类型的 WebSocket 帧。

import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;
import io.netty.handler.codec.http.websocketx.PongWebSocketFrame;
import io.netty.handler.codec.http.websocketx.CloseWebSocketFrame;

public class WebSocketFrameHandler extends SimpleChannelInboundHandler<WebSocketFrame> {
    
    @Override
    protected void channelRead0(ChannelHandlerContext ctx, WebSocketFrame frame) throws Exception {
        // 处理文本帧
        if (frame instanceof TextWebSocketFrame) {
            String request = ((TextWebSocketFrame) frame).text();
            System.out.println("Received message: " + request);
            // 发送消息给客户端
            ctx.channel().writeAndFlush(new TextWebSocketFrame("Hello, " + request));
        }
        
        // 处理 pong 帧
        else if (frame instanceof PongWebSocketFrame) {
            System.out.println("Received Pong frame");
        }
        
        // 处理关闭帧
        else if (frame instanceof CloseWebSocketFrame) {
            System.out.println("Received Close frame");
            ctx.channel().close();
        }
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        cause.printStackTrace();
        ctx.close();
    }
}

4.4 运行 WebSocket 服务器

现在,我们已经创建了一个简单的 WebSocket 服务器。当客户端与服务器建立连接时,WebSocket 握手将被自动完成。然后,客户端和服务器可以通过 WebSocket 连接互相发送消息。

5. 客户端连接 WebSocket 服务器

可以使用浏览器或 WebSocket 客户端库来连接 WebSocket 服务器。以下是一个简单的 JavaScript 客户端示例,演示如何连接到 WebSocket 服务器并发送消息:

let socket = new WebSocket("ws://localhost:8080/ws");

socket.onopen = function(event) {
    console.log("WebSocket connection established");
    socket.send("Hello, Netty!");
};

socket.onmessage = function(event) {
    console.log("Received message: " + event.data);
};

socket.onclose = function(event) {
    console.log("WebSocket connection closed");
};

socket.onerror = function(error) {
    console.log("WebSocket error: " + error);
};

6. 测试 WebSocket 服务器

  1. 启动 Netty WebSocket 服务器,运行 WebSocketServer
  2. 打开浏览器的控制台,或者使用工具如 PostmanWebSocket Client 等,连接到 ws://localhost:8080/ws
  3. 发送消息,服务器将接收到消息并返回一个响应。

7. 总结

本文展示了如何基于 Netty 5.0 实现一个 WebSocket 服务端应用。我们通过 WebSocketServerProtocolHandler 和自定义的 WebSocketFrameHandler 来处理 WebSocket 握手和消息传输。Netty 提供了强大的功能和高效的并发处理能力,是构建 WebSocket 服务的理想选择。

通过这种方式,你可以实现高性能的实时通信应用,特别适合高并发的场景,如在线游戏、即时聊天等。希望这篇文章能帮助你更好地理解和使用 Netty 5.0 来实现 WebSocket 服务!

… …

文末

好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。

… …

学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!

wished for you successed !!!


⭐️若喜欢我,就请关注我叭。

⭐️若对您有用,就请点赞叭。
⭐️若有疑问,就请评论留言告诉我叭。


版权声明:本文由作者原创,转载请注明出处,谢谢支持!

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。