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 ...
随机推荐
- [POJ3177]Redundant Paths(双联通)
在看了春晚小彩旗的E技能(旋转)后就一直在lol……额抽点时间撸一题吧…… Redundant Paths Time Limit: 1000MS Memory Limit: 65536K Tota ...
- [vijos1264]神秘的咒语(LCIS)
描述身为拜月教的高级间谍,你的任务总是逼迫你出生入死.比如这一次,拜月教主就派你跟踪赵灵儿一行,潜入试炼窟底.据说试炼窟底藏着五行法术的最高法术:风神,雷神,雪妖,火神,山神的咒语.为了习得这些法术, ...
- js中的DOM操作(1)
一.操作子节点 childNodes 通过该方式可以获取父节点下的所有子节点,但是由于浏览器的差异,这写节点中可能包含文本节点. <!DOCTYPE html> <html> ...
- 第二节Unity3D开发环境安装(windows系统)
这一节准备安装开发环境. 1. 首先先下载软件包:http://pan.baidu.com/s/1imYVv 4.2版本2.下载完后,解压会看到两个文件(运行第二个安装包) 3.准备安装,这 ...
- 每天一个linux命令(37):free 命令
free命令可以显示Linux系统中空闲的.已用的物理内存及swap内存,及被内核使用的buffer.在Linux系统监控的工具中,free命令是最经常使用的命令之一. 1.命令格式: free [参 ...
- 使用git管理代码的心得
一.简易使用流程 首先下载安装git,点击Git Bash进入编辑界面,之后如下图进入目录并通过命令 git init 把这个目录变成git可以管理的仓库 接下来使用git add .命令将所有文件添 ...
- Rhino Mock
mock interfaces, delegates and classes, including those with parameterized constructors. set expecta ...
- Oracle添加数据文件创建表空间,创建用户代码
1,添加数据文件创建表空间 CREATE TABLESPACE "TEST1" DATAFILE 'D:\ORACLE\11G\ORADATA\ORCL\TEST1.DBF' SI ...
- Java设计模式-桥接模式(Bridge)
桥接模式就是把事物和其具体实现分开,使他们可以各自独立的变化.桥接的用意是:将抽象化与实现化解耦,使得二者可以独立变化,像我们常用的JDBC桥DriverManager一样,JDBC进行连接数据库的时 ...
- golang thrift 源码分析,服务器和客户端究竟是如何工作的
首先编写thrift文件(rpcserver.thrift),运行thrift --gen go rpcserver.thrift,生成代码 namespace go rpc service RpcS ...
