IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> netty客户端发送,服务端接收不到消息 -> 正文阅读

[JavaScript知识库]netty客户端发送,服务端接收不到消息

今天遇到使用netty做客户端的时候,发送数据,服务端接收不到,但是客户端不添加自己的hadler就可以,后来发现,由于的我的需要使用byte[]进行接收与发送,channelFuture.channel.writeAndFlush()需要使用ByteBuff发送,因此在outHandler接收的时候类型不对,outhandler接收的是inhandler发送过来的integer,造成了异常,因此需要在outhandler中先判断下类型,如果是int走我的模式,如果不是需要走其他模式

public class RTUClient {

?? ?
??? public void test(){
??????? EventLoopGroup eventLoopGroup = new NioEventLoopGroup();
??????? Bootstrap bootstrap = new Bootstrap();
??????? try {
??????????? bootstrap.group(eventLoopGroup)
??????????? .channel(NioSocketChannel.class)
??????????? .handler(new ChannelInitializer<Channel>() {

??????????????? protected void initChannel(Channel channel) throws Exception {
?????????????????? ?
??????????????????? channel.pipeline().addLast(new RTUOutHandler());
??????????????????? channel.pipeline().addLast(new RTUInHandler());
?????????????????? ?
//??????????????????? channel.pipeline().addLast(new StringEncoder());
//??????????????????? channel.pipeline().addLast(new StringDecoder());
??????????????? }
?????????????? ?
??????????? });
?????????? ?
??????????? ChannelFuture channelFuture = bootstrap.connect("127.0.0.1", 8086).sync();
??????????? ByteBuf byteBuf = UnpooledByteBufAllocator.DEFAULT.buffer();
??????????? byteBuf.writeBytes("ETUNG:12345678901234511".getBytes(StandardCharsets.UTF_8));
??????????? channelFuture.channel().writeAndFlush(byteBuf);
//??????????? channelFuture.channel().writeAndFlush("ETUNG:123456789012345");
//??????????? channelFuture.channel().writeAndFlush(Unpooled.buffer().writeByte(12));
??????????? System.out.println("发送完毕");
??????????? channelFuture.addListener(new ChannelFutureListener() {
?????????????? ?
??????????????? @Override
??????????????? public void operationComplete(ChannelFuture arg0) throws Exception {
??????????????????? System.out.println("发送成功");
??????????????? }
??????????? });
//??????????? channelFuture.channel().closeFuture().sync();
??????????? System.out.println("发送完毕222");
??????? } catch (Exception e) {
??????????? eventLoopGroup.shutdownGracefully();
??????? }
?????? ?
??? }
?? ?
??? public static void main(String[] args) {
??????? RTUClient rtuClient = new RTUClient();
??????? rtuClient.test();
??? }
}

public class RTUInHandler extends ChannelInboundHandlerAdapter{
?? ?
??? @Override
??? public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
?????? ?
??????? ByteBuf byteBuf = (ByteBuf)msg;
??????? int length = byteBuf.readableBytes();
??????? byte[] receiveBytes = new byte[length];
??????? byteBuf.readBytes(receiveBytes);
??????? System.out.println("ByteUtil.toString(receiveBytes):"+ByteUtil.toString(receiveBytes));
??????? ReferenceCountUtil.release(msg);
?????? ?
??????? int step = 0;
??????? if(receiveBytes.length == 34){
??????????? step = 0;
??????? }else{
??????????? step = RTUUtil.bytesToInt(new byte[]{receiveBytes[3],receiveBytes[4],receiveBytes[5],receiveBytes[6]});
??????? }
?????? ?
??????? ctx.writeAndFlush(step);
?????????????? ?
//??????? ctx.writeAndFlush(msg);
??? }

}


public class RTUOutHandler extends ChannelOutboundHandlerAdapter{
?? ?
??? @Override
??? public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception {
??????? try{
??????????? if(msg instanceof Integer){? //判断下类型,客户端首次发送是ByteBuffer类型
??????????????? int step = (int) msg;
??????????????? byte[] bytes = RTUUtil.intToBytes(step);
??????????????? ByteBuf byteBuf = UnpooledByteBufAllocator.DEFAULT.buffer();
??????????????? ByteBuffer byteBuffer = ByteBuffer.allocate(7);
??????????????? byteBuffer.put((byte)0XAA);
??????????????? byteBuffer.put((byte)0XBB);
??????????????? byteBuffer.put((byte)0X00);
??????????????? for(int i=0;i<bytes.length;i++){
??????????????????? byteBuffer.put(bytes[i]);
??????????????? }
??????????????? byteBuffer.flip();
??????????????? byte[] bytes1 = byteBuffer.array();
??????????????? byte[] crc16 = CRC.swapCalcCrc16(bytes1);
??????????????? byteBuf.writeBytes(bytes1);
??????????????? byteBuf.writeBytes(crc16);
??????????????? super.write(ctx, byteBuf, promise);
??????????? }else{
??????????????? super.write(ctx, msg, promise);
??????????? }
?????????? ?
??????? }catch(Exception ex){
??????????? ex.printStackTrace();
??????? }
???????
?????? ?
??? }

}

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-03-12 17:23:13  更:2022-03-12 17:25:21 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/4 3:20:18-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码