Netty:实现同步发送并接收消息的一种方式
Netty创建通信服务时使用Nio异步通信, 配置代码(bootstrap.channel(NioSocketChannel.class);),要怎样实现这样一个同步发送消息并接收消息功能,虽然这样做觉得很没必要。
public class ChannelUtil {public static Object writeMsgSync(Object msg, Channel channel, AttributeKey<Object> attrKey, int timeout) throws Exception{if(channel.isActive()){synchronized(channel){Attribute<Object> attr = channel.attr(attrKey);synchronized(attr){attr.set(msg);System.out.println("发消息:"+msg);channel.writeAndFlush(msg);attr.wait(timeout * 1000);Object ret = attr.get();System.out.println("收消息:"+ret);attr.set(null);if(ret == msg){return null;}return ret;}}}return null;}
}
下面的方法需要加入到收消息的Handler(如SimpleChannelInboundHandler)中
@Overridepublic void onRead(ChannelHandlerContext ctx, CmdMsg msg) throws Exception {System.out.println("收到消息:"+msg);Channel channel = ctx.channel();Attribute<Object> attr = channel.attr(ClientGlobal.CHANNEL_SYNC_KEY);synchronized(attr){Object lastMsg = attr.get();if (lastMsg != null && lastMsg instanceof CmdMsg) {CmdMsg lastCmdMsg = (CmdMsg) lastMsg;if (msg.getCmdCode() == lastCmdMsg.getCmdCode()) {// 当前消息就是正在等待返回的响应消息,同步消息attr.set(msg);attr.notify();System.out.println("此消息是同步响应消息:" + msg);return;}else{if(msg.getCmdCode() == CmdConst.CMD_RET){RetMsg retMsg = (RetMsg)PackUtil.unpackCmdMsg(msg, RetMsg.class);if(retMsg.getOpCode() == lastCmdMsg.getCmdCode()){attr.set(msg);attr.notify();System.out.println("此消息是同步响应消息:" + msg);return;}}}}}System.out.println("消息加入到队列中:"+msg);MsgTask msgTask = new MsgTask();msgTask.setCtx(ctx);msgTask.setMsg(msg);BaseProcessor<?> processor = msgModule.getMsgProcessor(msg.getCmdCode());if(processor == null){//没有注册对应的消息加工器System.out.println("没有注册对应的消息加工器:msg code is "+msg.getCmdCode());return;}msgTask.setProcessor(processor);msgGueueMgr.pushMsgTask(msgTask);}
实现原理:通过Channel和Channel中的Attribute,利用wait、Notify,实现线程间通信
1: 发送消息时,将channel中的属性设值,然后提交到Netty内部消息队列,等待一个超时时间,如果这段时间内,有人将其唤醒,则取出channel的属性值,这个就是返回的消息;
2:接收消息时,判断channel中的属性是否有设值,若有,判断当前消息是否是此属性中消息的响应消息,若是,则唤醒channel属性。
Netty:实现同步发送并接收消息的一种方式相关推荐
- 【译】 WebSocket 协议第六章——发送与接收消息(Sending and Receiving Data)
概述 本文为 WebSocket 协议的第六章,本文翻译的主要内容为 WebSocket 消息发送与接收相关内容. 发送与接收消息(协议正文) 6.1 发送数据 为了通过 WebSocket 连接发送 ...
- MQ发送普通消息(三种方式)
MQ 发送普通消息有三种实现方式:可靠同步发送.可靠异步发送.单向(Oneway)发送.本文介绍了每种实现的原理.使用场景以及三种实现的异同,同时提供了代码示例以供参考. 可靠同步发送 原理:同步发送 ...
- 控制器中接收数据的四种方式
控制器中接收数据的四种方式: (仅限于个别的方式(get/post)有效) 通过形参的方式接收表单提交的数据(可以接收post与get提交的数据): 注释: GetData自己定义的方法名里面存入形参 ...
- SpringAMQP发送与接收消息
同步调用的优点:时效性较强,可以立即得到结果 同步调用的问题: 1.耦合度高 2.性能和吞吐能力下降 3.有额外的资源消耗 4.有级联失败问题 异步通信的优点: 1.耦合度低 2.吞吐量提升 3.故障 ...
- springboot websocket发送和接收消息代码资源下载
客户端发送给服务端的消息,同时接收服务端响应给客户端的消息: 服务端收到客户端发送过来的消息,并响应给客户端消息:
- ActiveMQ 发送和接收消息
一.添加 jar 包 <dependency><groupId>org.apache.activemq</groupId><artifactId>act ...
- java mqtt客户端_java 实现mqtt发送和接收消息客户端具体用法及测试代码
注:客户端代码实现请看我的上一篇 1mqtt发送消息 发送时不用多讲,每次发送肯定需要运行一次发送消息方法 MyMqttClient mqttClient = new MyMqttClient(); ...
- 通过kafka发送和接收消息
生产者配置类: @Configuration @EnableKafka public class KafkaProducerConfig {@Value("${kafkaConfig.add ...
- PC微信逆向:发送与接收消息的分析与代码实现
文章目录 定位微信的消息接收函数 定位消息接收函数的相关思路 定位消息内容的地址 分析接收消息函数 好友消息 群消息 总结 代码实现 定位微信的消息发送函数 定位消息发送函数的相关思路 过滤当前聊天窗 ...
最新文章
- codeforces 1016C - Vasya And The Mushrooms 【构造 + 思维】
- druid mysql配置详解_druid配置详解
- React前端格式化时间
- python dataframe 新列_Python第二十四课:Pandas库(四)
- Java编写程序将数据存入Kafka中
- 如何将mysql中的表传到elipse中_eclipse怎么连接到MySQL中的表!!!!!
- 10)-MySQL数据库基础练习(答案版)
- 论文查重软件检测报告怎么看?
- 自顶向下与自底向上编程思想的对比
- exsi rh2288hv5 驱动_华为2288H V5阵列卡驱动下载|
- OJ 里面的 G++ 和C++ 到底有什么区别, 为什么有时候G++能过,C++不能过,而有时候C++能过,G++不能过?
- win10系统安装到服务器失败怎么回事,U盘安装win10系统失败,提示Windows无法安装怎么办...
- 任正非 《一江春水向东流》
- 第一周项目0-宣告主权
- 很多情侣看了后,晚上再不关机了!
- 在chrome中屏蔽百度推荐
- 指尖江湖李忘生鸿蒙初开,剑网3指尖江湖李忘生怎么样_李忘生装备搭配、技能特性、解锁方法介绍_游戏吧...
- 计算机网络技术2020,计算机网络技术超星2020试题及答案
- java将秒转换为天,时,分
- 解决Plugin ‘xxx‘ is incompatible with this installation的问题