【ZeroMQ】1、ZeroMQ(java)入门之Requerst/Response模式
自己最开始是在cloud foundry中接触过消息服务器(nats),或者说是消息中间件,也算是初步知道了一个消息服务器对于分布式的网络系统的重要性,后来自己也曾想过在一些项目中使用它,尤其是在一些分布式的环境下,可以极大的方便整个系统的实现。。。。
例如如下的形式:
在中间通过一个消息中间件,可以很方便的将各个woker的数据发送到最终的统计服务器来做数据的统计,从而减少很多在网络通信中会消耗的编程时间。。。。
ZeroMQ算是在在网上能搜到的较为出名的消息中间件了吧,不过其实看了它的用法之后越来越觉得它是非典型的消息中间件,而且更像是一个网络通信框架。。。。
初步了解之后,对其的强大功能所折服,但是发现其实能查到的中文材料很少,难道是在国内的使用并不多。。。?这么强大的神器。。。。好吧,那就自己先来写一下ZeroMQ的入程吧。。。其实也就是将 http://zguide.zeromq.org/page:all#Handling-Multiple-Sockets 这里的内容翻译了一下而已。。。
首先要说一下,ZeroMQ有多语言的实现方式,其中C语言的实现性能是最高的,除此以外也有纯java的实现,官方的说明是比C语言的实现在性能上要差10%-20%,不过我觉得已经足够用了。。。。
那么这篇文章来讲最简单的一种通信模式吧:Request/Response
场景说明:client向server发送hello,server向client返回world。。。如下图所示:
按照我们常规的想法,我们可能会想到首先在服务器端建立一个ServerSocket的监听,然后客户端向服务端发起socket的连接,建立连接了之后,再进行数据通信。。。。
说起来很简单,但是实际处理起来却很麻烦。。。
那么我们来看看用ZeroMQ这个实现起来将会是多么轻松加愉快吧:
先来看看server端的代码:
package fjs;
import org.zeromq.ZMQ;
public class Response {
public static void main (String[] args) {
ZMQ.Context context = ZMQ.context(1); //这个表示创建用于一个I/O线程的context
ZMQ.Socket socket = context.socket(ZMQ.REP); //创建一个response类型的socket,他可以接收request发送过来的请求,其实可以将其简单的理解为服务端
socket.bind ("tcp://*:5555"); //绑定端口
int i = 0;
int number = 0;
while (!Thread.currentThread().isInterrupted()) {
i++;
if (i == 10000) {
i = 0;
System.out.println(++number);
}
byte[] request = socket.recv(); //获取request发送过来的数据
//System.out.println("receive : " + new String(request));
String response = "world";
socket.send(response.getBytes()); //向request端发送数据 ,必须要要request端返回数据,没有返回就又recv,将会出错,这里可以理解为强制要求走完整个request/response流程
}
socket.close(); //先关闭socket
context.term(); //关闭当前的上下文
}
}
上述的代码够简单吧,而且基本就算不懂ZeroMQ也能基本看懂这段代码是什么意思。。。
首先建立了一个包含有一个I/O线程的context,接着创建了一个REP,也就是response类型的socket,并将其绑定到5555端口上,接着就进入了循环,不断的从socket中读取数据,然后再返回数据给request端,也就是客户端。。。
啊,现在还要感叹一下,代码好简单,,,这里我还加上了一些自己的其余的代码,总共也没写多少行。。。。
好了,接下来来看客户端的实现代码吧:
package fjs;
import org.zeromq.ZMQ;
public class Request {
public static void main(String args[]) {
for (int j = 0; j < 5; j++) {
new Thread(new Runnable(){
public void run() {
// TODO Auto-generated method stub
ZMQ.Context context = ZMQ.context(1); //创建一个I/O线程的上下文
ZMQ.Socket socket = context.socket(ZMQ.REQ); //创建一个request类型的socket,这里可以将其简单的理解为客户端,用于向response端发送数据
socket.connect("tcp://127.0.0.1:5555"); //与response端建立连接
long now = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
String request = "hello";
socket.send(request.getBytes()); //向reponse端发送数据
byte[] response = socket.recv(); //接收response发送回来的数据 正在request/response模型中,send之后必须要recv之后才能继续send,这可能是为了保证整个request/response的流程走完
// System.out.println("receive : " + new String(response));
}
long after = System.currentTimeMillis();
System.out.println((after - now) / 1000);
}
}).start();;
}
}
}
这里的代码,应该也能够很容易的读懂吧,首先创建了包含一个线程的context,然后创建了一个REQ,也就是request类型的socket,然后与5555端口建立连接,然后就进入了循环,不断的向服务端发送数据,然后接收数据。。。
这样到此为止,服务端和客户端的代码都已经贴出来完了。。。当然要使用ZeroMQ,我是用Maven直接引入的,依赖如下:
<dependency>
<groupId>org.zeromq</groupId>
<artifactId>jeromq</artifactId>
<version>0.3.1</version>
</dependency>
可以得出结论,ZeroMQ可以极大的简化我们网络通信编程的工作,觉得可以称得上是神器了。。而且性能很好。。。
转自:http://itindex.net/detail/50653-zeromq-java-requerst
【ZeroMQ】1、ZeroMQ(java)入门之Requerst/Response模式的更多相关文章
- Java入门学习路线目录索引
原创 Java入门学习路线目录索引 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/One_ ...
- Java入门第一章
后天就是十一长假了,亲们准备好了去哪儿玩了吗? 今天有点空,就来聊聊Java吧,当然是一些Java入门知识了,网上有很多,这里我只是列举一些我自己学到的,感谢大家关注喵的博客这么久,也为大家带来点新知 ...
- [Java入门笔记] 面向对象编程基础(二):方法详解
什么是方法? 简介 在上一篇的blog中,我们知道了方法是类中的一个组成部分,是类或对象的行为特征的抽象. 无论是从语法和功能上来看,方法都有点类似与函数.但是,方法与传统的函数还是有着不同之处: 在 ...
- 第1章Java入门体验
第1章Java入门体验 1.java简介和平台应用 Java是sun公司开发出来,现在属于ORACLE公司java分为几个部分:首先是最基础的Java SE部分,这部分是Java的基础知识,主要包括: ...
- Java入门记(五):容器关系的梳理(下)——Map
注意:阅读本文及相关源码时,需要数据结构相关知识,包括:哈希表.链表.红黑树. Map是将键(key)映射到值(value)的对象.不同的映射不能包含相同的键:每个键最多只能映射到一个值.下图是常见M ...
- Java入门(二)——果然断更的都是要受惩罚的。。。
断更了一个多月,阅读量立马从100+跌落至10-,虽说不是很看重这个,毕竟只是当这个是自己的学习笔记,但有人看,有人评论,有人认同和批评的感觉还是很巴适的,尤其以前有过却又被剥夺的,惨兮兮的. 好好写 ...
- Android初涉及之Android Studio&JAVA入门--二月不能不写东西
是的,我还没有放弃写博客. 是的,我也没有放弃PHP的学习. 是的,我要开始学学最TM火的Android开发了. 你呢 1.Android Studio 一.概况 安装和配置什么的就不具体说了,网上一 ...
- JAVA手记 JAVA入门(安装+Dos下运行)
JAVA入门特供= =,今天设置环境变量后用dos运行的时候发现出现“找不到或无法加载主类”,索性查了些资料重新看了看JAVA入门的部分. 声明:我的笔记本暂时用的是Win10系统,Windows其他 ...
- Java Server returned HTTP response code: 401
今天写一个小功能需要通过http请求获取一些返回数据,但是在登陆时是需要进行用户名和密码的校验的.写好之后请求,返回异常Java Server returned HTTP response code: ...
随机推荐
- C# DataGridView中单元格Cell改变事件
DataGridView控件中的各种事件都无法直接响应Cell中内容的变化,包括KeyPress等事件,可以采用下面方法 private void dataGridViewBarcode_Editin ...
- 520 简单表白代码(JS)
这两天不知道咋了,迷迷糊糊的,突然知道今天是520的我,急急忙忙赶出个程序(新手,代码有点乱),发出来大家一起研究下(参考百度的). <!DOCTYPE html> <html> ...
- 上下文相关的GMM-HMM声学模型续:参数共享
一.三音素建模存在的问题 问题一:很多三音素在训练数据中没有出现(尤其跨词三音素) 问题二:在训练数据中出现过的三音素有相当一部分出现的频次较少 因此,三音素模型训练时存在较严重的数据不足问题 二.参 ...
- JavaScript getter和setter
对象的属性是由属性名name,值key,和其他特性(可读写性 writable,可枚举性enumerable,可配置性configurable)组成的.从ES5开发,提供了getter和setter ...
- Hive在drop表的时候报错
问题背景: 在安装完Hive之后,初始化mysql是成功的,hive启动也是成功的,也能创建database,在database中也能创建表,也能查看表结构,但是在drop的时候就不行了,在hive ...
- iOS开发-实现相机app的方法[转载自官方]
This brief code example to illustrates how you can capture video and convert the frames you get to U ...
- Linux 学习错误点整理之网络配置
本人是一名实习生,最近在学习Linux,在实操的过程中还是遇到了一些问题,所以想记录下来,供自己以后复习,也希望能给跟我一样的菜鸟的人带来一点点帮助. 我用的是VMware Workstation P ...
- 【并发】1、关于线程的几种状态&关于yield的理解
最近在看disruptor源码,在获取ringbuffer的下一个序列的时候,disruptor有几种等待策略,其中有YieldingWaitStrategy类,是使用java的Thread.yiel ...
- redis常用命令(二)
一.集合(set) 单值多value,vaue不能重复 sadd/smembers/sismember 添加数据/获取set所有数据/判断是否存在某个值 scard 获取集合里面的元素个数 srem ...
- Form表单中不同的按钮进行不同的跳转
本文参考:http://my.oschina.net/sallency/blog/300568 在开发工作共我们往往会遇到一个表单需要包含多个action不同的提交动作,这时候就不能在使用submit ...