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:实现同步发送并接收消息的一种方式相关推荐

  1. 【译】 WebSocket 协议第六章——发送与接收消息(Sending and Receiving Data)

    概述 本文为 WebSocket 协议的第六章,本文翻译的主要内容为 WebSocket 消息发送与接收相关内容. 发送与接收消息(协议正文) 6.1 发送数据 为了通过 WebSocket 连接发送 ...

  2. MQ发送普通消息(三种方式)

    MQ 发送普通消息有三种实现方式:可靠同步发送.可靠异步发送.单向(Oneway)发送.本文介绍了每种实现的原理.使用场景以及三种实现的异同,同时提供了代码示例以供参考. 可靠同步发送 原理:同步发送 ...

  3. 控制器中接收数据的四种方式

    控制器中接收数据的四种方式: (仅限于个别的方式(get/post)有效) 通过形参的方式接收表单提交的数据(可以接收post与get提交的数据): 注释: GetData自己定义的方法名里面存入形参 ...

  4. SpringAMQP发送与接收消息

    同步调用的优点:时效性较强,可以立即得到结果 同步调用的问题: 1.耦合度高 2.性能和吞吐能力下降 3.有额外的资源消耗 4.有级联失败问题 异步通信的优点: 1.耦合度低 2.吞吐量提升 3.故障 ...

  5. springboot websocket发送和接收消息代码资源下载

    客户端发送给服务端的消息,同时接收服务端响应给客户端的消息: 服务端收到客户端发送过来的消息,并响应给客户端消息:

  6. ActiveMQ 发送和接收消息

    一.添加 jar 包 <dependency><groupId>org.apache.activemq</groupId><artifactId>act ...

  7. java mqtt客户端_java 实现mqtt发送和接收消息客户端具体用法及测试代码

    注:客户端代码实现请看我的上一篇 1mqtt发送消息 发送时不用多讲,每次发送肯定需要运行一次发送消息方法 MyMqttClient mqttClient = new MyMqttClient(); ...

  8. 通过kafka发送和接收消息

    生产者配置类: @Configuration @EnableKafka public class KafkaProducerConfig {@Value("${kafkaConfig.add ...

  9. PC微信逆向:发送与接收消息的分析与代码实现

    文章目录 定位微信的消息接收函数 定位消息接收函数的相关思路 定位消息内容的地址 分析接收消息函数 好友消息 群消息 总结 代码实现 定位微信的消息发送函数 定位消息发送函数的相关思路 过滤当前聊天窗 ...

最新文章

  1. codeforces 1016C - Vasya And The Mushrooms 【构造 + 思维】
  2. druid mysql配置详解_druid配置详解
  3. React前端格式化时间
  4. python dataframe 新列_Python第二十四课:Pandas库(四)
  5. Java编写程序将数据存入Kafka中
  6. 如何将mysql中的表传到elipse中_eclipse怎么连接到MySQL中的表!!!!!
  7. 10)-MySQL数据库基础练习(答案版)
  8. 论文查重软件检测报告怎么看?
  9. 自顶向下与自底向上编程思想的对比
  10. exsi rh2288hv5 驱动_华为2288H V5阵列卡驱动下载|
  11. OJ 里面的 G++ 和C++ 到底有什么区别, 为什么有时候G++能过,C++不能过,而有时候C++能过,G++不能过?
  12. win10系统安装到服务器失败怎么回事,U盘安装win10系统失败,提示Windows无法安装怎么办...
  13. 任正非 《一江春水向东流》
  14. 第一周项目0-宣告主权
  15. 很多情侣看了后,晚上再不关机了!
  16. 在chrome中屏蔽百度推荐
  17. 指尖江湖李忘生鸿蒙初开,剑网3指尖江湖李忘生怎么样_李忘生装备搭配、技能特性、解锁方法介绍_游戏吧...
  18. 计算机网络技术2020,计算机网络技术超星2020试题及答案
  19. java将秒转换为天,时,分
  20. 解决Plugin ‘xxx‘ is incompatible with this installation的问题

热门文章

  1. 少年没有乌托邦,心向远方自明朗
  2. 如何写出高质量的技术文章?
  3. C3 AI和贝克休斯将提供企业AI解决方案,加速马石油数字化转型
  4. JVM经典五十问,这下面试稳了
  5. Bash Shell 中单引号和双引号的区别
  6. 姿态篇:一.初识姿态估计
  7. client中周期性边界_第一布里渊区.ppt
  8. 大数据审计的发展_浅谈大数据时代下审计工作的发展方向
  9. 上有老下有小 “夹心族”理财要稳也要赚
  10. Windows 7删除休眠文件