ZeroMQ之Request/Response (Java)
自己最开始是在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(); //这个表示创建用于一个I/O线程的context
- ZMQ.Socket socket = context.socket(ZMQ.REP); //创建一个response类型的socket,他可以接收request发送过来的请求,其实可以将其简单的理解为服务端
- socket.bind ("tcp://*:5555"); //绑定端口
- int i = ;
- int number = ;
- while (!Thread.currentThread().isInterrupted()) {
- i++;
- if (i == ) {
- i = ;
- 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 = ; j < ; j++) {
- new Thread(new Runnable(){
- public void run() {
- // TODO Auto-generated method stub
- ZMQ.Context context = ZMQ.context(); //创建一个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 = ; i < ; 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) / );
- }
- }).start();;
- }
- }
- }
这里的代码,应该也能够很容易的读懂吧,首先创建了包含一个线程的context,然后创建了一个REQ,也就是request类型的socket,然后与5555端口建立连接,然后就进入了循环,不断的向服务端发送数据,然后接收数据。。。
这样到此为止,服务端和客户端的代码都已经贴出来完了。。。当然要使用ZeroMQ,我是用Maven直接引入的,依赖如下:
- <dependency>
- <groupId>org.zeromq</groupId>
- <artifactId>jeromq</artifactId>
- <version></version>
- </dependency>
可以得出结论,ZeroMQ可以极大的简化我们网络通信编程的工作,觉得可以称得上是神器了。。而且性能很好。。。
ZeroMQ之Request/Response (Java)的更多相关文章
- request response
request 和 response 这两个对象是出现在service方法中.service方法是用来接收请求处理请求,完成响应的. 接受请求指的就是request对象 完成响应指的就 ...
- 过滤器中的chain.doFilter(request,response)
Servlet中的过滤器Filter是实现了javax.servlet.Filter接口的服务器端程序,主要的用途是过滤字符编码.做一些业务逻辑判断等.其工作原理是,只要你在web.xml文件配置好要 ...
- 对chain.doFilter(request,response)的理解
他的作用是将请求转发给过滤器链上下一个对象.这里的“下”指的是哪里 ? 指的是下一个filter,如果没有filter那就是你请求的资源. 一般filter都是一个链,web.xml 里面配置了几个就 ...
- JavaWeb学习笔记四 request&response
HttpServletResponse 我们在创建Servlet时会覆盖service()方法,或doGet()/doPost(),这些方法都有两个参数,一个为代表请求的request和代表响应res ...
- day06 Request Response
rw 读写模板的设置 day05 Request Response 1. HttpServletResponse 简介 1.1 Response 的 OutputStream 输出中文的问题 1.2 ...
- request+response+jsp+el+jstl
response: 1.设置响应行的状态码: response.setStatus(int sc); 2.设置response缓冲区的编码:response.setCharacterEncoding( ...
- test request&&response 代码实现
使用工具 IDEA 创建一个登录页面和后方数据库连接 1.编写login.html文件 导入到web文件夹下 设置配置文件 druid.properties 导入jar包 放置到web文件夹下 ...
- 第六天-request response\04-response实现文件下载.avi--本人测试失败
package cn.itcast.response; import java.io.FileInputStream;import java.io.IOException;import java.io ...
- response.sendRedirect()和request.getRequestDispatcher().forward(request,response)的区别
转发方式:request.getRequestDispatcher().forward(); 重定向方式:response.sendRedirect(); 下面是HttpServletRespons ...
随机推荐
- HTC Vive 体验的折腾经历
HTC Vive 是个什么东西, 想必我就不用介绍了, 不知道自己百度吧 HTC Vive发布已经有一段时间了, 一直很纠结买还是不买, 这玩意太贵(官网6888),买了还不能直接用, 还要配太高性能 ...
- android之对话、单复框的使用
对话框 通过builder来构建一个单选框 package xidian.dy.com.chujia; import android.content.DialogInterface; import a ...
- RequireJS学习资料汇总
入门系列 [1]阮一峰 RequireJS用法 [2]RequireJS入门指南 文档系列 [1]RequireJS中文文档 [2]RequireJS英文文档 代码实践 知识扩展 [1]计算机干了什么
- Java数组的--遍历
(I)标准for循环遍历数组 例如代码片段: int [] nums = new int [] {0,1,2,3,4,5,6,7,8,9}; for(int i=0;i<11;i++){ Sys ...
- 在Web Service中傳送Dictionary
有個需求,想在Web Service中傳遞Dictionary<string, string>參數,例如: 排版顯示純文字 [WebMethod] public Dictionary< ...
- xcode7 __weak 导致报错 is unavailable
Build Settings Apple LLVM7.1 Laguage-Object-c Weak References in Manual Retain Release 选 Yes;
- 读JS高级API笔记_(DOM&&DOM2&&DOM3)哎呀——园龄才9个月啊
---恢复内容开始--- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http: ...
- 牛客网上的剑指offer题目
题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 题目:请实现一个函数,将一 ...
- 查询条件Where
1.字符串 $condition = 'name=\'Lily\' and age>10'; 2.数组 ['type' => 1, 'status' => 1] //生成 (type ...
- Mac OS X系统下编译运行C代码
1.使用编译器将源文件中的代码转换为二进制代码,这个过程叫做编译. 将终端的工作路径切换到源文件所在的路径. cc -c 源文件的名称.例如:cc -c main.c 如果没有意外的话,就会在当前工作 ...
