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月前
|
开发框架 前端开发 网络协议
Spring Boot结合Netty和WebSocket,实现后台向前端实时推送信息
【10月更文挑战第18天】 在现代互联网应用中,实时通信变得越来越重要。WebSocket作为一种在单个TCP连接上进行全双工通信的协议,为客户端和服务器之间的实时数据传输提供了一种高效的解决方案。Netty作为一个高性能、事件驱动的NIO框架,它基于Java NIO实现了异步和事件驱动的网络应用程序。Spring Boot是一个基于Spring框架的微服务开发框架,它提供了许多开箱即用的功能和简化配置的机制。本文将详细介绍如何使用Spring Boot集成Netty和WebSocket,实现后台向前端推送信息的功能。
557 1
|
2月前
|
前端开发 网络协议
netty整合websocket(完美教程)
本文是一篇完整的Netty整合WebSocket的教程,介绍了WebSocket的基本概念、使用Netty构建WebSocket服务器的步骤和代码示例,以及如何创建前端WebSocket客户端进行通信的示例。
299 2
netty整合websocket(完美教程)
|
7月前
|
前端开发 JavaScript Java
Springboot+Netty+WebSocket搭建简单的消息通知
这样,你就建立了一个简单的消息通知系统,使用Spring Boot、Netty和WebSocket实现实时消息传递。你可以根据具体需求扩展和改进该系统。
176 1
|
前端开发 Java 程序员
Spring Boot+Netty+Websocket实现后台向前端推送信息
学过 Netty 的都知道,Netty 对 NIO 进行了很好的封装,简单的 API,庞大的开源社区。深受广大程序员喜爱。基于此本文分享一下基础的 netty 使用。实战制作一个 Netty + websocket 的消息推送小栗子。
|
存储 数据安全/隐私保护
Netty实战(十三)WebSocket协议(一)
WebSocket 协议是完全重新设计的协议,旨在为 Web 上的双向数据传输问题提供一个切实可行的解决方案,使得客户端和服务器之间可以在任意时刻传输消息,因此,这也就要求它们异步地处理消息回执。
329 0
|
7月前
|
测试技术
Netty4 websocket 开启服务端并设置IP和端口号
Netty4 websocket 开启服务端并设置IP和端口号
216 0
|
移动开发 小程序 Java
良心分享:基于Java+SpringBoot+Netty+WebSocket+Uniapp轻松搭建在线互动问答程序
本文将详细介绍如何基于你自己的开源项目搭建一个在线互动问答程序,包括微信小程序和H5网页版。 该项目服务端主要使用了Java + Spring Boot + Netty + WebSocket等技术栈,聊天客户端使用的是UniApp来轻松搭建微信小程序和H5网页端。
87 1
|
数据安全/隐私保护
Netty实战(十四)WebSocket协议(二)
我们之前说过为了将 ChannelHandler 安装到 ChannelPipeline 中,需要扩展了ChannelInitializer,并实现 initChannel()方法
206 0
|
开发框架 JavaScript 前端开发
如何使用SpringBoot和Netty实现一个WebSocket服务器,并配合Vue前端实现聊天功能?
如何使用SpringBoot和Netty实现一个WebSocket服务器,并配合Vue前端实现聊天功能?
323 0
|
存储
Netty入门到超神系列-基于WebSocket开发聊天室
在很多的网站中都嵌入有聊天功能,最理想的方式就是使用WebSocket来开发,屏幕面前的你如果不清楚WebSocket的作用可以自己去百度一下,Netty提供了WebSocket支持,这篇文章将使用Netty作为服务器,使用WebSocket开发一个简易的聊天室系统。
268 0