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 ...
随机推荐
- CSS3之过渡Transition
CSS3中的过渡Transition有四个中心属性:transition-property.transition-duration.transition-delay和transition-timing ...
- [设计模式] Javascript 之 外观模式
外观模式说明 说明:外观模式是用于由于子系统或程序组成较复杂而提供的一个高层界面接口,使用客户端更容易访问底层的程序或系统接口; 外观模式是我们经常使用遇到的模式,我们经常涉及到的功能,可能需要涉及到 ...
- mysqldump使用方法
1.mysqldump的几种常用方法: (1)导出整个数据库(包括数据库中的数据) mysqldump -u username -p dbname > dbname.sql (2)导出数据库结构 ...
- 转-JS中document对象详解
对象属性 document.title //设置文档标题等价于HTML的<title>标签 document.bgColor //设置页面背景色 document.fgColor //设置 ...
- 关于Jquery 操作Cookie 取值错误
使用JQuery操作cookie时 发生取的值不正确的问题: 结果发现cookie有四个不同的属性: 名称,内容,域,路径 $.cookie('the_cookie'); // 读取 cookie $ ...
- poj2485&&poj2395 kruskal
题意:最小生成树的最大边最小,sort从小到大即可 poj2485 #include<stdio.h> #include<string.h> #include<algor ...
- The big deffrence between ($(du * )) and $(du *)
Infolist=($(du *))echo "Get the list one $Infolist"This has formed a array after quating t ...
- artDialog 文档
artDialog —— 经典.优雅的网页对话框控件. 支持普通与 12 方向气泡状对话框 完善的焦点处理,自动焦点附加与回退 支持 ARIA 标准 面向未来:基于 HTML5 Dialog 的 AP ...
- Linux Rootkit Sample && Rootkit Defenser Analysis
目录 . 引言 . LRK5 Rootkit . knark Rootkit . Suckit(super user control kit) . adore-ng . WNPS . Sample R ...
- Oracle存储过程中传入参数,传出字符串
create or replace procedure getStr(usercode in varchar2,str out varchar2) is v_sql ); isEdit ); isAd ...
