需要用到网络通信时,ZeroMQ( 简称ZMQ )比较方便,他提供了许多对服务端和客户端之间的通信方式:REP/REQ、PULL/PUSH( 应用这两个就能实现比较简单的数据查询与发送功能 ), 具体有方式在ZMQ的jar包的ZMQ.class 中可以看到,都是通过定义为int常量,如下:

 1     public static final int PUB = 1;
 2     public static final int SUB = 2;
 3
 4     public static final int REQ = 3;
 5     public static final int REP = 4;
 6
 7     public static final int DEALER = 5;
 8
 9     public static final int XREQ = 5;
10     public static final int XREP = 6;
11
12     public static final int ROUTER = 6;
13
14
15     public static final int PULL = 7;
16     public static final int PUSH = 8;
17
18     public static final int XPUB = 9;
19     public static final int XSUB = 10;
20
21     public static final int STREAMER = 1;
22     public static final int FORWARDER = 2;
23
24     public static final int QUEUE = 3;
25
26     public static final int UPSTREAM = 7;
27     public static final int DOWNSTREAM = 8;

下面就以REQ/REP为例进行简单的说明。

REQ( Request ) 和REP( Response )进行编程时,首先需要建立一个REP,并开始接受请求,在收到请求之后需要对请求进行处理,处理完返回处理结果即可,代码如下:

 1     public static void main(String[] argv) {
 2         ZMQ.Context context = ZMQ.context(1);
 3         ZMQ.Socket socket = context.socket(ZMQ.REP);
 4         String url = "tcp://*:9999";
 5         try {
 6             socket.bind(url);
 7         } catch (ZMQException e) {
 8             throw e;
 9         }
10         boolean wait = true;
11         while (wait) {
12             byte[] request;
13             try {
14                 request = socket.recv(0);
15
16
17                 /* TODO process request
18                  * .....
19                 */
20                 socket.send("OK".getBytes(), 1);
21
22             } catch (ZMQException e) {
23                 throw e;
24             }
25         } // while(wait)
26     }

客户端在通过REQ进行编程时,需要把请求通过byte类型( 需要与服务端接收请求的类型一至,一般用byte,官网上的示例代码是这样的,而且一般都以\0 表示结束 )发送过去,之后等待响应。代码如下:

 1     public static void main(String[] args) {
 2         ZMQ.Context context = ZMQ.context(1);
 3         ZMQ.Socket socket = context.socket(ZMQ.REQ);
 4
 5         System.out.println("Connecting to hello world server...");
 6         socket.connect("tcp://localhost:9999");
 7
 8         String requestString = "Hello" + " ";
 9         byte[] request = requestString.getBytes();
10         socket.send(request, 0);
11
12         byte[] reply = socket.recv(0);
13         System.out.println("Received reply   [" + new String(reply) + "]");
14     }

注:官方给的示例代码中在send和recv方法中传int类型值的时候都是用0, 在ZMQ类中有一个变量public static final int PAIR = 0, 可能就是这个变量吧,说明在通信过程中是要相互匹配的( 如REQ和REP要一起工作, 个人猜想 ),否则在工作过程中是会抛异常的。

官方在git上的代码位置为: https://github.com/imatix/zguide2

转载于:https://www.cnblogs.com/sigh-differ/archive/2012/11/12/zmq-first-blood.html

Java 使用ZeroMQ 2.2 进行通信编程相关推荐

  1. java面试题44关于 Socket 通信编程,以下描述正确的是:( )

    java面试题44关于 Socket 通信编程,以下描述正确的是:( ) A 客户端通过new ServerSocket()创建TCP连接对象 B 客户端通过TCP连接对象调用accept()方法创建 ...

  2. Java基础复习笔记系列 九 网络编程

    Java基础复习笔记系列之 网络编程 学习资料参考: 1.http://www.icoolxue.com/ 2. 1.网络编程的基础概念. TCP/IP协议:Socket编程:IP地址. 中国和美国之 ...

  3. 2018-2019-2 20175227张雪莹《Java程序设计》实验五 《网络编程与安全》

    2018-2019-2 20175227张雪莹<Java程序设计> 实验五 <网络编程与安全> 实验报告封面 课程:Java程序设计 班级:1752班 姓名:张雪莹 学号:20 ...

  4. Java实现简易聊天室以及Scoket编程入门

    介绍了Scoekt的概念,并且提供了基于TCP和UDP协议的Java Socket API编写的简单通信程序,比如简易的聊天室. 此前我们简单的学了各种协议,我们知道大部分的应用层协议,比如HTTP. ...

  5. VC串口通信编程-2

    VC串口通信编程 (2009-07-08 13:48:40) 转载▼ Win32串口编程(转:韩耀旭) 在工业控制中,工控机(一般都基于Windows平台)经常需要与智能仪表通过串口进行通信.串口通信 ...

  6. ZeroMq实现跨线程通信

    ZeroMq实现跨线程通信 之前在技术崇拜的技术经理指导下阅读了ZeroMq的基础代码,现在就将阅读的心得与成果记录一下,并重新模仿实现了一下经理的异步队列. 1.对外接口 //主要接口(1)void ...

  7. 浅谈通信编程(二)--如何分离通信物理接口和应用程序

    如何分离通信物理接口和应用程序<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" ...

  8. C#中串口通信编程 收藏

    C#中串口通信编程 收藏 本文将介绍如何在.NET平台下使用C#创建串口通信程序,.NET 2.0提供了串口通信的功能,其命名 空间是System.IO.Ports.这个新的框架不但可以访问计算机上的 ...

  9. 浅谈JAVA中如何利用socket进行网络编程(二)

    转自:http://developer.51cto.com/art/201106/268386.htm Socket是网络上运行的两个程序间双向通讯的一端,它既可以接受请求,也可以发送请求,利用它可以 ...

最新文章

  1. java B2B2C Springcloud多租户电子商城系统-消息驱动的微服务(消费分区)
  2. 一加6升级android p,一加6手机升级安卓P攻略 教你怎么更新安卓P Beta版
  3. Spring Security3源码分析-UsernamePasswordAuthenticationFilter分析
  4. Ubuntu如何搭建Django与Flup和Nginx环境?
  5. VirtualBox Ubuntu个人配置
  6. jenkins 部署问题
  7. 电脑显示没有被指定在上运行_可以桌面显示的便条便签怎么弄?有没有电脑桌面上的便条贴...
  8. 怎么向字体库中添加字体
  9. photoshop高光,暗,中间调选区获取
  10. pytorch官网不支持cuda10.2
  11. VMware Workstation 15 Player 社区版安装教程
  12. 分享 :CSS常见面试题
  13. LLVM 与 Clang 介绍
  14. python输入日期选择日期_python输入日期输出星座?
  15. 【SeMask】Semantically Masked Transformers for Semantic Segmentation
  16. vue 大屏数字上下滚动
  17. 考研英语二阅读理解态度题解题技巧
  18. 高等数学在计算机的应用论文,高等数学论文-计算机软件和应用.doc
  19. 微型计算机周明德课后答案,微机原理(周明德)课后题答案..doc
  20. SYDTEK系列芯片低速PWM的三个模式和用法

热门文章

  1. 关于series的统计
  2. Java--消除重复数字后的最大值
  3. js中let和var定义变量的区别
  4. 二叉树最近公共祖先节点
  5. (LBS)基于地理位置的社交应用大战
  6. 数据库大型应用解决方案总结(转)
  7. 算法----------找到 K 个最接近的元素
  8. 第二周项目2-就拿胖子说事
  9. Android Studio 新建项目的R文件丢失的解决方法
  10. Flutter开发之GridView组件(20)