netty 的客户端通常是websoket   但是为了演示也可以用netty做客户端,

  • Channel:可以被理解为数据传输的通道。
  • Pipeline:可以被视为一个由多个工序组成的流水线,负责将数据(事件)传递给流水线上的每个处理工序(handler)。
  • Msg:指的是在流水线上流动的数据。最初输入的数据通常是ByteBuf类型,但当它经过流水线上的各个处理工序后,可能会被转换成其他类型的数据对象,然后再变回ByteBuf进行输出。
  • Handler:可以被理解为流水线上的各个处理工序。每个工序负责对数据进行特定的处理(通过重写相应的事件处理方法)。
  • Inbound and Outbound Handler:入站(Inbound)和出站(Outbound)两类处理工序。入站处理工序负责处理进入的数据,而出站处理工序负责处理发送的数据。
  • EventLoop:可以理解为负责处理数据的工人。每个工人可以管理多个通道的读写操作,并且一旦负责了某个通道,就会一直负责到底(绑定)。工人既可以执行IO操作,也可以执行任务处理。
  • Worker:每位工人都有一个任务队列,队列中可以存放多个通道的待处理任务。任务分为普通任务和定时任务。
  • Processing Order:工人按照流水线的顺序,根据每个处理工序(handler)的规划(代码)依次处理数据。可以为流水线上的每道工序指定不同的工人来负责。
  • 每个流水只对自己流水一部份感 兴趣,比如 channelRead    这儿就对处理读的管道

整 体使用netty 流程 ‘ 以下是一个完整 示例代码流程,浏览器运行locallost:8088  将会看到hello word

以下代码只是演示一个最简单的 使用,所以使用了HttpHandler  ,我们还能用来处理json 的,不过这些我们在下面在示例

以下示例用来buffer的示例,直接显示hello ,这个例子更直接。

拿 到输出句柄最常用有二种方式,以下是关于future拿 结果的二种方式,最后一种是promect,就是拿到鉴听的句柄,用来调关闭或监听那个方法,

这个包是

promise 结果

Handerl 有很多种,处理编吗,响应的啊,字节啊,好多好多,都 是一条管理依次顺序来运行

各种handel

用于测度的andel

netty   中的bybuffer 是对nio 的buffer 增强自动扩容,

生命 周期

channelRegisterd注册

chanetlUnregisterdd 移除

channelActive  活跃

excetptionCaught  捕获异常

handlerAdded   助手添加

handlerRemoved  助手移除

示例二 netty 用于websockkect的例子,说例说初充一下websocket 的用法 先建一个入口文件

package org.rsms.websocjet;

import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.nio.NioEventLoopGroup; public class WSServer {
public static void main(String[] args) throws Exception { NioEventLoopGroup mainGroup = new NioEventLoopGroup();
NioEventLoopGroup subGroup = new NioEventLoopGroup(); try {
// 启动服务器
ServerBootstrap server = new ServerBootstrap();
server.group(mainGroup, subGroup)
.channel(io.netty.channel.socket.nio.NioServerSocketChannel.class)
.childHandler(new WSServerInitialzer());
ChannelFuture future = server.bind(8089).sync();
future.channel().closeFuture().sync();
}finally {
mainGroup.shutdownGracefully();
subGroup.shutdownGracefully();
}
}
} 

然后编写初始化管道 ,这儿主要是增加大在文件读写

package org.rsms.websocjet;

import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.codec.http.HttpObjectAggregator;
import io.netty.handler.codec.http.HttpServerCodec;
import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler;
import io.netty.handler.stream.ChunkedWriteHandler; public class WSServerInitialzer extends ChannelInitializer<SocketChannel> {
@Override
protected void initChannel(SocketChannel ch) throws Exception {
// 我们要处理大数据和http协议的channelPipeline.addLast(new HttpServerCodec());
ChannelPipeline pipeline = ch.pipeline();
pipeline.addLast(new HttpServerCodec());
// 对大文件读写
pipeline.addLast(new ChunkedWriteHandler());
// 封装http 相关,聚合请求和响应。几乎netty 都 要用一下
pipeline.addLast(new HttpObjectAggregator(1024 * 64));
// 以上是用于http 协议支持
// 以下的websocketw会帮我处理一些复杂的事,比如close ping pong 等等,心跳处理
// 对于websocket来讲,都是以frames进行传输的,不同的数据对应的frames 也不同
pipeline.addLast(new WebSocketServerProtocolHandler("/ws"));
pipeline.addLast(new ChatHandler()); }
}

  第三步就是编写自己的业务软件

这一步比较重要:

  1. 定义ChatHandler类并继承SimpleChannelInboundHandler<TextWebSocketFrame>
  2. 定义一个静态的ChannelGroup变量clinets,用于存储所有连接的Channel
  3. 重写channelRead0方法,用于处理接收到的文本WebSocket帧:
  4. 重写handlerAdded方法,当有新的Channel添加到ChannelPipeline时调用:
  5. 重写handlerRemoved方法,当有ChannelChannelPipeline中移除时调用:
package org.rsms.websocjet;

import io.netty.channel.Channel;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.channel.group.ChannelGroup;
import io.netty.channel.group.DefaultChannelGroup;
import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;
import io.netty.util.concurrent.GlobalEventExecutor; import java.time.LocalDate; public class ChatHandler extends SimpleChannelInboundHandler<TextWebSocketFrame> {
// 这个是可以保存所有连接的channel
private static ChannelGroup clinets = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);
@Override
protected void channelRead0(ChannelHandlerContext ctx, TextWebSocketFrame msg)
throws Exception {
String content = msg.text();
System.out.println("收到的消息");
System.out.println("received:" + msg.text());
// 这儿channel.writeAndFlush是不能接传字符串的,除了for 可以对clinet遍历,
// 其实clients.writeAndFlush(content)也是可以打印结果
for(Channel channel : clinets){
channel.writeAndFlush(new TextWebSocketFrame("服务器收到消息:" + content));
channel.writeAndFlush(new TextWebSocketFrame("服务器收到消息:" + LocalDate.now()));
} } @Override
public void handlerAdded(ChannelHandlerContext ctx) throws Exception {
System.out.println("有人来了添加一个channel");
clinets.add(ctx.channel());
} @Override
public void handlerRemoved(ChannelHandlerContext ctx) throws Exception {
System.out.println("有人走了删除一个channel");
System.out.println("客户id 长整型"+ ctx.channel().id().asLongText());
System.out.println("客户,短整型" + ctx.channel().id().asShortText());
// clinets.remove(ctx.channel());
}
}

websocket api  介结

WebSocket API 是一种在单个 TCP 连接上进行全双工通信的协议。它允许服务器与客户端之间进行实时双向通信。下面是如何使用 WebSocket API 的详细步骤:

  1. 创建 WebSocket 对象

    使用 new WebSocket(url) 来创建一个新的 WebSocket 对象,其中 url 是 WebSocket 服务器的地址。例如:

     
    var socket = new WebSocket("ws://example.com:8080");
  2. 监听 WebSocket 生命周期事件

    WebSocket 对象有四个重要的生命周期事件:openmessageerror, 和 close。你可以通过设置这些事件的 on 属性来添加事件处理函数。

    • onopen: 当连接建立时触发。
    • onmessage: 当从服务器接收到消息时触发。
    • onerror: 当发生错误时触发。
    • onclose: 当连接关闭时触发。

    示例如下:

    // 创建 WebSocket 对象
    var socket = new WebSocket("ws://example.com:8080"); // 监听打开事件
    socket.onopen = function(event) {
    console.log("WebSocket 连接已打开", event);
    // 发送一条消息到服务器
    socket.send("Hello, Server!");
    }; // 监听消息事件
    socket.onmessage = function(event) {
    console.log("从服务器接收到数据", event.data);
    // 关闭连接
    socket.close();
    }; // 监听错误事件
    socket.onerror = function(error) {
    console.error("WebSocket 发生错误", error);
    }; // 监听关闭事件
    socket.onclose = function(event) {
    console.log("WebSocket 连接已关闭", event);
    };

关于netty 一些使用细节的更多相关文章

  1. Netty源码细节-accept、read(Linux os层 + Netty层代码细节)(转)

    原文:http://budairenqin.iteye.com/blog/2215899 这篇分析一下accept的细节, 我觉得网络IO相关开发很多时候不能仅仅局限于java层, 尤其从accept ...

  2. Netty源码细节IO线程(EventLoop)(转)

    原文:http://budairenqin.iteye.com/blog/2215896 源码来自Netty5.x版本, 本系列文章不打算从架构的角度去讨论netty, 只想从源码细节展开, 又不想通 ...

  3. eventloop & actor模式 & Java线程模型演进 & Netty线程模型 总结

    eventloop的基本概念可以参考:http://www.ruanyifeng.com/blog/2013/10/event_loop.html Eventloop指的是独立于主线程的一条线程,专门 ...

  4. Netty版本升级血泪史之线程篇

    1. 背景 1.1. Netty 3.X系列版本现状 根据对Netty社区部分用户的调查,结合Netty在其它开源项目中的使用情况,我们可以看出目前Netty商用的主流版本集中在3.X和4.X上,其中 ...

  5. 【Netty源码分析】Reactor线程模型

    1. 背景 1.1. Java线程模型的演进 1.1.1. 单线程 时间回到十几年前,那时主流的CPU都还是单核(除了商用高性能的小机),CPU的核心频率是机器最重要的指标之一. 在Java领域当时比 ...

  6. Netty系列之Netty线程模型

    Reference: http://www.infoq.com/cn/articles/netty-threading-model 1. 背景 1.1. Java线程模型的演进 1.1.1. 单线程 ...

  7. 当Tomcat遇上Netty

    故事背景 嘀嘀嘀~,生产事故,内存泄漏! 昨天下午,突然收到运维的消息,分部某系统生产环境内存泄漏了,帮忙排查一下. 排查过程 第一步,要日志 分部给到的异常日志大概是这样(鉴于公司规定禁止截图禁止拍 ...

  8. 聊聊 Netty 那些事儿之 Reactor 在 Netty 中的实现(创建篇)

    本系列Netty源码解析文章基于 4.1.56.Final版本 在上篇文章<聊聊Netty那些事儿之从内核角度看IO模型>中我们花了大量的篇幅来从内核角度详细讲述了五种IO模型的演进过程以 ...

  9. 一文聊透 Netty 核心引擎 Reactor 的运转架构

    本系列Netty源码解析文章基于 4.1.56.Final版本 本文笔者来为大家介绍下Netty的核心引擎Reactor的运转架构,希望通过本文的介绍能够让大家对Reactor是如何驱动着整个Nett ...

  10. Spark2.1.0——内置RPC框架详解

    Spark2.1.0——内置RPC框架详解 在Spark中很多地方都涉及网络通信,比如Spark各个组件间的消息互通.用户文件与Jar包的上传.节点间的Shuffle过程.Block数据的复制与备份等 ...

随机推荐

  1. WPF开发快速入门【6】下拉框与枚举类型

    概述 本文讲述下拉框和枚举类型进行绑定的一些操作. 下拉框的基本操作 设计部分: <ComboBox ItemsSource="{Binding Fruits}" Selec ...

  2. nginx002: NGINX的环境变量,基本命令参数,目录关系及gzip优化

    NGINX的环境变量,基本命令参数,目录关系及gzip优化 添加环境变量 nginx命令执行方式 nginx [选项] [参数] 通过编译安装的nginx 默认是没有环境变量的,如何设置环境变量,让n ...

  3. 使用C#开发微信公众号对接ChatGPT和DALL-E

    本人是一家小公司的技术总监,工作包括写市场分析.工作汇报.产品推广文案及代码开发等.在ChatGPT推出之后本人一直在工作中使用,在头脑风暴.大纲生成.语句优化.代码生成方面很有效果.但ChatGPT ...

  4. 《剑指offer - 题目2》

    题目描述 请实现一个函数,将一个字符串中的每个空格替换成"%20".例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy.   注意方 ...

  5. JavaServlet和后端的搭建(以Tomcat为例)

    目录 Servlet 前端如何才能访问到后端? 后端开发准备工作(配置Tomcat) 对象的生命周期 后端平台的搭建 创建Web项目(前提搭建好Tomcat配置) 创建Java文件 配置Web.xml ...

  6. sqlite3自动插入创建时间和更新时间

    最近在记录一些简单的结构化日志信息时,用到了sqlite3数据库(保存的信息比较简单,用Mysql,SQL Server,Postgres这些数据库有点小题大做). 以前开发系统时,用Mysql和Po ...

  7. The model backing the 'MainDbContext' context has changed since the database was created. Consider using Code First Migrations to update the database (http://go.microsoft.com/fwlink/?LinkId=238269).

    The model backing the 'MainDbContext' context has changed since the database was created. Consider u ...

  8. Kubernetes监控手册04-监控Kube-Proxy

    简介 首先,请阅读文章<Kubernetes监控手册01-体系介绍>,回顾一下 Kubernetes 架构,Kube-Proxy 是在所有工作负载节点上的. Kube-Proxy 默认暴露 ...

  9. SonarQube代码质量扫描工具

    1.什么是SonarQube 既然是学习devops 运维流水线构建 开发 ↓ 测试 ↓ 运维 华为devops软件开发流水线文档 https://support.huaweicloud.com/re ...

  10. 一个开源且全面的C#算法实战教程

    前言 算法在计算机科学和程序设计中扮演着至关重要的角色,如在解决问题.优化效率.决策优化.实现计算机程序.提高可靠性以及促进科学融合等方面具有广泛而深远的影响.今天大姚给大家分享一个开源.免费.全面的 ...