netty 实现 websocket

简介: netty 实现 websocket

WebSocket是一种网络通信协议,它提供了全双工的通信通道,允许服务器与客户端之间进行实时双向数据传输。其详细介绍如下:

  • 协议概述:WebSocket属于IETF定的标准协议,运行在TCP之上的应用层协议。不同于HTTP的请求-响应模式,WebSocket提供了一个持久化的连接,使得通信更加高效。
  • 工作原理:WebSocket的工作开始于一个握手过程,这个过程通过HTTP完成,一旦握手成功,就建立了一个可以直接进行数据交换的连接。这种机制大大简化了客户端和服务器之间的数据交换过程。
  • 优势对比:与传统的HTTP轮询相比,WebSocket减少了不必要的服务器请求,节省了带宽和其他资源。由于WebSocket连接是持久的,并且由服务器主动推送消息,因此其实时性非常高。
  • 标准制定:WebSocket通信协议在2011年被IETF定为标准RFC 6455,并由RFC7936进行了补充规范。同时,WebSocket API也被W3C定为标准。
  • 应用场景:WebSocket特别适用于需要实时数据交换的场景,如在线聊天、实时通知、股票或者体育赛事更新等。它能够实现快速的数据传输,而无需像传统方式那样频繁地建立新的连接。

     WebSocket作为一种高效的通信协议,它通过提供持久化连接和减少不必要的数据传输,极大地优化了实时数据交换的过程,是现代网络应用中不可或缺的技术之一。



Netty 是一个高性能、异步事件驱动的网络应用框架,用于快速开发可维护的高性能协议服务器和客户端。要在 Netty 中实现 WebSocket,步骤如下:

1. 添加 Netty 依赖

在你的项目中添加 Netty 的依赖。如果你使用的是 Maven,可以在 `pom.xml` 文件中添加以下依赖:


<dependency>
    <groupId>io.netty</groupId>
    <artifactId>netty-all</artifactId>
    <version>4.1.63.Final</version>
</dependency>

2. 创建 WebSocket 服务器

创建一个继承自 `ChannelInitializer` 的类,用于初始化 ChannelPipeline。在这个类中,你需要添加一个 `HttpServerCodec` 和一个自定义的 `WebSocketServerHandler`。`HttpServerCodec` 用于处理 HTTP 请求,而 `WebSocketServerHandler` 用于处理 WebSocket 连接。

import io.netty.channel.ChannelInitializer;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.codec.http.HttpServerCodec;


public class WebSocketServerInitializer extends ChannelInitializer<SocketChannel> {


    @Override
    protected void initChannel(SocketChannel ch) throws Exception {
        ch.pipeline().addLast(new HttpServerCodec());
        ch.pipeline().addLast(new WebSocketServerHandler());
    }
}

3. 创建 WebSocket 处理器

创建一个继承自 `SimpleChannelInboundHandler` 的类,用于处理 WebSocket 消息。在这个类中,你需要重写 `channelRead0` 方法,以便在接收到 WebSocket 消息时进行处理。


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


public class WebSocketServerHandler extends SimpleChannelInboundHandler<TextWebSocketFrame> {


    @Override
    protected void channelRead0(ChannelHandlerContext ctx, TextWebSocketFrame msg) throws Exception {
        // 处理接收到的 WebSocket 消息
        System.out.println("收到消息:" + msg.text());
    }
}

4. 启动 WebSocket 服务器

创建一个主类,用于启动 WebSocket 服务器。在这个类中,你需要创建一个 `EventLoopGroup`,一个 `ServerBootstrap`,并将它们与你的 `WebSocketServerInitializer` 关联起来。然后,调用 `bind` 方法启动服务器。


import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioServerSocketChannel;


public class WebSocketServer {


    public static void main(String[] args) 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());


            b.bind(8080).sync().channel().closeFuture().sync();
        } finally {
            bossGroup.shutdownGracefully();
            workerGroup.shutdownGracefully();
        }
    }
}

现在,咱们已经成功实现了一个简单的 WebSocket 服务器。我们可以运行这个程序,然后在浏览器中使用 JavaScript 连接到这个服务器并发送 WebSocket 消息。

浏览器客户端连接websocket的例子:

在介绍netty客户端之前,我们先看一个简单的浏览器客户端连接websocket的例子:

// 创建连接
const socket = new WebSocket('ws://localhost:8000');

// 开启连接
socket.addEventListener('open', function (event) {
    socket.send('没错,开启了!');
});

// 监听消息
socket.addEventListener('message', function (event) {
    console.log('监听到服务器的消息 ', event.data);
});
目录
相关文章
|
2月前
|
前端开发 JavaScript Java
Springboot+Netty+WebSocket搭建简单的消息通知
这样,你就建立了一个简单的消息通知系统,使用Spring Boot、Netty和WebSocket实现实时消息传递。你可以根据具体需求扩展和改进该系统。
76 1
|
9月前
|
前端开发 Java 程序员
Spring Boot+Netty+Websocket实现后台向前端推送信息
学过 Netty 的都知道,Netty 对 NIO 进行了很好的封装,简单的 API,庞大的开源社区。深受广大程序员喜爱。基于此本文分享一下基础的 netty 使用。实战制作一个 Netty + websocket 的消息推送小栗子。
|
12月前
|
存储 数据安全/隐私保护
Netty实战(十三)WebSocket协议(一)
WebSocket 协议是完全重新设计的协议,旨在为 Web 上的双向数据传输问题提供一个切实可行的解决方案,使得客户端和服务器之间可以在任意时刻传输消息,因此,这也就要求它们异步地处理消息回执。
198 0
|
12月前
|
数据安全/隐私保护
Netty实战(十四)WebSocket协议(二)
我们之前说过为了将 ChannelHandler 安装到 ChannelPipeline 中,需要扩展了ChannelInitializer,并实现 initChannel()方法
131 0
|
11月前
|
开发框架 JavaScript 前端开发
如何使用SpringBoot和Netty实现一个WebSocket服务器,并配合Vue前端实现聊天功能?
如何使用SpringBoot和Netty实现一个WebSocket服务器,并配合Vue前端实现聊天功能?
232 0
|
12月前
|
存储
Netty入门到超神系列-基于WebSocket开发聊天室
在很多的网站中都嵌入有聊天功能,最理想的方式就是使用WebSocket来开发,屏幕面前的你如果不清楚WebSocket的作用可以自己去百度一下,Netty提供了WebSocket支持,这篇文章将使用Netty作为服务器,使用WebSocket开发一个简易的聊天室系统。
214 0
|
12月前
|
前端开发 JavaScript
Netty异步NIO框架(二)websocket 前端后端聊天 私聊及群聊
Netty异步NIO框架(二)websocket 前端后端聊天 私聊及群聊
|
12月前
|
网络协议 前端开发 Java
Netty异步NIO框架(一)java服务端与客户端实现聊天 websocket通道
Netty异步NIO框架(一)java服务端与客户端实现聊天 websocket通道
|
编解码 网络协议 容器
Netty网络编程(六):搭建websocket服务器
Netty网络编程(六):搭建websocket服务器
851 0
|
Web App开发 JavaScript Java
Netty 实现 WebSocket 聊天功能
websocket评测:http://itindex.net/detail/53887-websocket-框架-性能 不想看那么长文字的可以直接看结果: 测试结果分析 Netty, Node.js, Undertow, Vert.x都能正常建立百万连接。
2457 0