「zmq教程java」zmq安装

博主:adminadmin 2023-01-14 05:00:10 579

今天给各位分享zmq教程java的知识,其中也会对zmq安装进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

linux下java开发如何使用jzmq?

运行报错找不到java.library.path是因为没有找到java的lib库路径,建议你按照下面方法尝试下:

1:首先你要在Linux里面把jdk配置好,最好是找个1.6版本的,配置也就是下载好压缩包,解压了,然后把jdk的目录配置到Linux的PATH环境变量里,具体方法,自己查资料;

2:安装了jdk的话,那就再下载个Eclipse这个开发软件吧,作为java的IDE开发工具,挺好使唤的;

3:把你的项目都加到Eclipse里,这次应该就不会找不到java.library.path。

ZMQ JAVA使用经验之 ZMQ简介怎么解决

ZMQ JAVA使用经验之 ZMQ简介怎么解决:

ZMQ被称为史上最快消息队列,它处于会话层之上,应用层之下,使用后台异步线程完成消息的接受和发送,完美的封装了Socket API,大大简化了编程人员的复杂度,被称为史上最强大的消息中间件。ZMQ是用C语言编写的,30s内完成消息的传输,能够兼容多个平台,多种语言,可以使用多种方式实现N对N的Socket连接。本文仅以JAVA版本的ZMQ API为例,介绍ZMQ。

ZMQ与传统的TCP Socket相比,具有以下优点:

1) ZMQ发送和接受的是具有固定长度的二进制对象,ZMQ的消息包最大254个字节,前6个字节是协议,然后是数据包。数据包由3个部分组成,第一个字节是包的长度,第二个字节是包的一些属性,最后是包的内容。如果超过255个字节(有一个字节表示包属性),则ZMQ会自动分包传输;而对于TCP Socket,是面向字节流的连接,编程人员需要处理数据块与数据块之间的边界问题,而ZMQ能够保证每次用户发送和接受的都是一个完整的数据块;

2) 传统的TCP Socket的连接是1对1的,可以认为“1个Socket=1个连接”,每一个线程独立的维护一个Socket。但是ZMQ摒弃了这种1对1的模式,ZMQ的Socket可以很轻松的实现1对N,N对1和N对N的连接模式,一个ZMQ的Socket可以自动的维护一组连接,用户无法操作这些连接,用户只能操作套接字,而不是连接本身,所以说ZMQ的世界里,连接是私有的。这里大家关心的一点是,一个Socket是如何识别来自多个Socket的连接的,这里以请求响应模式为例介绍ZMQ是如何实现一个Socket连接N个Socket的;

3)ZMQ使用异步后台线程处理接受和发送请求,这意味着发送完消息,不可以立即释放资源,消息什么时候发送用户是无法控制的,同时,ZMQ自动重连,这意味着用户可以以任意顺序加入到网络中,服务器也可以随时加入或者退出网络;

ZMQ之所以能够在无状态的网络中实现1对N的连接,关键在于信封的机制,信封里保存了应答目标的位置。ZMQ涉及到请求-响应模式的Socket一共有4种类型:

DEALER是一种负载均衡,它会将消息分发给已连接的节点,并使用公平队列的机制处理接受到的消息。

REQ发送消息时会在消息顶部插入一个空帧,接受时会将空帧移去。其实REQ是建立在DEALER之上的,但REQ只有当消息发送并接受到回应后才能继续运行。

ROUTER在收到消息时会在顶部添加一个信封,标记消息来源。发送时会通过该信封决定哪个节点可以获取到该条消息。

REP在收到消息时会将第一个空帧之前的所有信息保存起来,将原始信息传送给应用程序。在发送消息时,REP会用刚才保存的信息包裹应答消息。REP其实是建立在ROUTER之上的,但和REQ一样,必须完成接受和发送这两个动作后才能继续。

在了解了4种类型的Socket之后,我们就不难理解ZMQ的信封机制了。ZMQ信封机制的核心是Router Socket,它的工作原理如下:

从ROUTER中读取一条消息时,ZMQ会包上一层信封,上面注明了消息的来源。向ROUTER写入一条消息时(包含信封),ZMQ会将信封拆开,并将消息递送给相应的对象。当REQ Socket向ROUTER Socket发送一条请求后,REP会从ROUTER收到一条消息,消息格式如下:

第三帧是REP从应用程序收到的数据,第二帧是空帧,是REQ在发送ROUTER数据之前添加的,用来表示结束,第一帧即信封,是ROUTER添加的,主要用来记录消息来源;整个数据包处理过程如下:

对于REQ Socket,可以在创建Socket的时候,为该Sock指定标示符,此时的Socket称为持久Socket,没有指定标示符的我们称为瞬时Socket,ROUTER会自动为瞬时Socket生成一个标示符;

这样REP返回包含信封的数据给ROUTER,ROUTER就可以根据信封上的标示符将该消息发送到对应的REQ上;

ZMQ使用注意事项:

ZMQ是在发送端缓存消息的,可以通过阈值控制消息的溢出;

ZMQ不可以线程之间共享Socket,否则会报org.zeromq.ZMQException: Operation cannot be accomplished in current state错误。

ZMQ一个进程只允许有一个Context,new Context(int arg) arg表示后台线程的数量;

ZMQ的Socket类有一个Linger参数,可以通过SetLinger设置,主要用于表示该Socket关闭以后,未发送成功的消息是否还保存,如果设置为-1表示该消息将永久保存(除非宕机,ZMQ是不持久化消息的),如果为0表示所有未发送成功的消息在Socker关闭以后都将立即清除,如果是一个正数,则表示该消息在Socket关闭后多少毫秒内被删除;这个方法非常有用,尤其在控制发送失败时,是否重发消息。

消息中间件(一)MQ详解及四大MQ比较

一、消息中间件相关知识

1、概述

消息队列已经逐渐成为企业IT系统内部通信的核心手段。它具有低耦合、可靠投递、广播、流量控制、最终一致性等一系列功能,成为异步RPC的主要手段之一。当今市面上有很多主流的消息中间件,如老牌的ActiveMQ、RabbitMQ,炙手可热的Kafka,阿里巴巴自主开发RocketMQ等。

2、消息中间件的组成

2.1 Broker

消息服务器,作为server提供消息核心服务

2.2 Producer

消息生产者,业务的发起方,负责生产消息传输给broker,

2.3 Consumer

消息消费者,业务的处理方,负责从broker获取消息并进行业务逻辑处理

2.4 Topic

2.5 Queue

2.6 Message

消息体,根据不同通信协议定义的固定格式进行编码的数据包,来封装业务数据,实现消息的传输

3 消息中间件模式分类

3.1 点对点

PTP点对点:使用queue作为通信载体

说明:

消息生产者生产消息发送到queue中,然后消息消费者从queue中取出并且消费消息。

消息被消费以后,queue中不再存储,所以消息消费者不可能消费到已经被消费的消息。 Queue支持存在多个消费者,但是对一个消息而言,只会有一个消费者可以消费。

说明:

queue实现了负载均衡,将producer生产的消息发送到消息队列中,由多个消费者消费。但一个消息只能被一个消费者接受,当没有消费者可用时,这个消息会被保存直到有一个可用的消费者。

4 消息中间件的优势

4.1 系统解耦

交互系统之间没有直接的调用关系,只是通过消息传输,故系统侵入性不强,耦合度低。

4.2 提高系统响应时间

例如原来的一套逻辑,完成支付可能涉及先修改订单状态、计算会员积分、通知物流配送几个逻辑才能完成;通过MQ架构设计,就可将紧急重要(需要立刻响应)的业务放到该调用方法中,响应要求不高的使用消息队列,放到MQ队列中,供消费者处理。

4.3 为大数据处理架构提供服务

通过消息作为整合,大数据的背景下,消息队列还与实时处理架构整合,为数据处理提供性能支持。

4.4 Java消息服务——JMS

Java消息服务(Java Message Service,JMS)应用程序接口是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。

5 消息中间件应用场景

5.1 异步通信

有些业务不想也不需要立即处理消息。消息队列提供了异步处理机制,允许用户把一个消息放入队列,但并不立即处理它。想向队列中放入多少消息就放多少,然后在需要的时候再去处理它们。

5.2 解耦

降低工程间的强依赖程度,针对异构系统进行适配。在项目启动之初来预测将来项目会碰到什么需求,是极其困难的。通过消息系统在处理过程中间插入了一个隐含的、基于数据的接口层,两边的处理过程都要实现这一接口,当应用发生变化时,可以独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束。

5.3 冗余

有些情况下,处理数据的过程会失败。除非数据被持久化,否则将造成丢失。消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险。许多消息队列所采用的”插入-获取-删除”范式中,在把一个消息从队列中删除之前,需要你的处理系统明确的指出该消息已经被处理完毕,从而确保你的数据被安全的保存直到你使用完毕。

5.4 扩展性

因为消息队列解耦了你的处理过程,所以增大消息入队和处理的频率是很容易的,只要另外增加处理过程即可。不需要改变代码、不需要调节参数。便于分布式扩容。

5.5 过载保护

在访问量剧增的情况下,应用仍然需要继续发挥作用,但是这样的突发流量无法提取预知;如果以为了能处理这类瞬间峰值访问为标准来投入资源随时待命无疑是巨大的浪费。使用消息队列能够使关键组件顶住突发的访问压力,而不会因为突发的超负荷的请求而完全崩溃。

5.6 可恢复性

系统的一部分组件失效时,不会影响到整个系统。消息队列降低了进程间的耦合度,所以即使一个处理消息的进程挂掉,加入队列中的消息仍然可以在系统恢复后被处理。

5.7 顺序保证

在大多使用场景下,数据处理的顺序都很重要。大部分消息队列本来就是排序的,并且能保证数据会按照特定的顺序来处理。

5.8 缓冲

在任何重要的系统中,都会有需要不同的处理时间的元素。消息队列通过一个缓冲层来帮助任务最高效率的执行,该缓冲有助于控制和优化数据流经过系统的速度。以调节系统响应时间。

5.9 数据流处理

分布式系统产生的海量数据流,如:业务日志、监控数据、用户行为等,针对这些数据流进行实时或批量采集汇总,然后进行大数据分析是当前互联网的必备技术,通过消息队列完成此类数据收集是最好的选择。

6 消息中间件常用协议

6.1 AMQP协议

AMQP即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同开发语言等条件的限制。

优点:可靠、通用

6.2 MQTT协议

MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是IBM开发的一个即时通讯协议,有可能成为物联网的重要组成部分。该协议支持所有平台,几乎可以把所有联网物品和外部连接起来,被用来当做传感器和致动器(比如通过Twitter让房屋联网)的通信协议。

优点:格式简洁、占用带宽小、移动端通信、PUSH、嵌入式系统

6.3 STOMP协议

STOMP(Streaming Text Orientated Message Protocol)是流文本定向消息协议,是一种为MOM(Message Oriented Middleware,面向消息的中间件)设计的简单文本协议。STOMP提供一个可互操作的连接格式,允许客户端与任意STOMP消息代理(Broker)进行交互。

优点:命令模式(非topic\queue模式)

6.4 XMPP协议

XMPP(可扩展消息处理现场协议,Extensible Messaging and Presence Protocol)是基于可扩展标记语言(XML)的协议,多用于即时消息(IM)以及在线现场探测。适用于服务器之间的准即时操作。核心是基于XML流传输,这个协议可能最终允许因特网用户向因特网上的其他任何人发送即时消息,即使其操作系统和浏览器不同。

优点:通用公开、兼容性强、可扩展、安全性高,但XML编码格式占用带宽大

6.5 其他基于TCP/IP自定义的协议

有些特殊框架(如:redis、kafka、zeroMq等)根据自身需要未严格遵循MQ规范,而是基于TCP\IP自行封装了一套协议,通过网络socket接口进行传输,实现了MQ的功能。

7 常见消息中间件MQ介绍

7.1 RocketMQ

阿里系下开源的一款分布式、队列模型的消息中间件,原名Metaq,3.0版本名称改为RocketMQ,是阿里参照kafka设计思想使用java实现的一套mq。同时将阿里系内部多款mq产品(Notify、metaq)进行整合,只维护核心功能,去除了所有其他运行时依赖,保证核心功能最简化,在此基础上配合阿里上述其他开源产品实现不同场景下mq的架构,目前主要多用于订单交易系统。

具有以下特点:

官方提供了一些不同于kafka的对比差异:

7.2 RabbitMQ

使用Erlang编写的一个开源的消息队列,本身支持很多的协议:AMQP,XMPP, SMTP,STOMP,也正是如此,使的它变的非常重量级,更适合于企业级的开发。同时实现了Broker架构,核心思想是生产者不会将消息直接发送给队列,消息在发送给客户端时先在中心队列排队。对路由(Routing),负载均衡(Load balance)、数据持久化都有很好的支持。多用于进行企业级的ESB整合。

7.3 ActiveMQ

Apache下的一个子项目。使用Java完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现,少量代码就可以高效地实现高级应用场景。可插拔的传输协议支持,比如:in-VM, TCP, SSL, NIO, UDP, multicast, JGroups and JXTA transports。RabbitMQ、ZeroMQ、ActiveMQ均支持常用的多种语言客户端 C++、Java、.Net,、Python、 Php、 Ruby等。

7.4 Redis

使用C语言开发的一个Key-Value的NoSQL数据库,开发维护很活跃,虽然它是一个Key-Value数据库存储系统,但它本身支持MQ功能,所以完全可以当做一个轻量级的队列服务来使用。对于RabbitMQ和Redis的入队和出队操作,各执行100万次,每10万次记录一次执行时间。测试数据分为128Bytes、512Bytes、1K和10K四个不同大小的数据。实验表明:入队时,当数据比较小时Redis的性能要高于RabbitMQ,而如果数据大小超过了10K,Redis则慢的无法忍受;出队时,无论数据大小,Redis都表现出非常好的性能,而RabbitMQ的出队性能则远低于Redis。

7.5 Kafka

Apache下的一个子项目,使用scala实现的一个高性能分布式Publish/Subscribe消息队列系统,具有以下特性:

7.6 ZeroMQ

号称最快的消息队列系统,专门为高吞吐量/低延迟的场景开发,在金融界的应用中经常使用,偏重于实时数据通信场景。ZMQ能够实现RabbitMQ不擅长的高级/复杂的队列,但是开发人员需要自己组合多种技术框架,开发成本高。因此ZeroMQ具有一个独特的非中间件的模式,更像一个socket library,你不需要安装和运行一个消息服务器或中间件,因为你的应用程序本身就是使用ZeroMQ API完成逻辑服务的角色。但是ZeroMQ仅提供非持久性的队列,如果down机,数据将会丢失。如:Twitter的Storm中使用ZeroMQ作为数据流的传输。

ZeroMQ套接字是与传输层无关的:ZeroMQ套接字对所有传输层协议定义了统一的API接口。默认支持 进程内(inproc) ,进程间(IPC) ,多播,TCP协议,在不同的协议之间切换只要简单的改变连接字符串的前缀。可以在任何时候以最小的代价从进程间的本地通信切换到分布式下的TCP通信。ZeroMQ在背后处理连接建立,断开和重连逻辑。

特性:

二、主要消息中间件的比较

linux中Trimmomatic安装与使用

trimmomatic是一款用来处理illumina测序数据的工具,可以是单条的single reads,也可以是成对的pairend reads。支持压缩格式数据。功能和其他数据处理的程序都差不多,主要包括,1、去除adapter序列以及测序中其他特殊序列;2、采用滑动窗口的方法,切除或者删除低质量碱基

1. 先新建一个文件夹,mkdir trimmomatic

2.  cd Trimmomatic   (后ls)

3. wget

4. unzip Trimmomatic-0.38.zip

5. cd Trimmomatic-0.38  (后ls)

6.  which java  (java 在/opt/tesc/share/jdk1.8.0-20/bin/java中)

7.  /opt/tesc/share/jdk1.8.0-20/bin/java   (后ls)

8. pwd

9. /opt/tsce/share/jdk1.8.0_20/bin/java -jar /home/HYZ930402/Zmq/trimmomatic/Trimmomatic-0.38/trimmomatic-0.38.jar

10.  ls

11. /opt/tsce/share/jdk1.8.0_20/bin/java -jar /home/HYZ930402/Zmq/trimmomatic/Trimmomatic-0.38/trimmomatic-0.38.jar  --help

12. 进入自己fastq数据的文件夹

13./opt/tsce/share/jdk1.8.0_20/bin/java -jar /home/HYZ930402/Zmq/trimmomatic/Trimmomatic-0.38/trimmomatic-0.38.jar PE -phred33 017_R1.fastq 017_R2.fastq output_forward_paired.fq.gz output_forward_unpaired.fq.gz output_reverse_paired.fq.gz output_reverse_unpaired.fq.gz ILLUMINACLIP:TruSeq3-PE.fa:2:30:10 LEADING:3 TRAILING:3 SLIDINGWINDOW:4:15 MINLEN:36

(/opt/tsce/share/jdk1.8.0_20/bin/java为Java的路径,-jar /home/HYZ930402/Zmq/trimmomatic/Trimmomatic-0.38/trimmomatic-0.38.jar为该软件所在的位置,需要明确指明质量值体系是Phred33还是Phred64,默认是Phred64,这需要特别注意,因为我们现在的测序数据基本都是Phred33的了,所以一定要指定这个参数。017_R1.fastq 017_R2.fastq要进行过滤的文件,output_forward_paired.fq.gz output_forward_unpaired.fq.gz output_reverse_paired.fq.gz output_reverse_unpaired.fq.gz为输出文件

ILLUMINACLIP,接头序列切除参数。LLUMINACLIP:TruSeq3-PE.fa:2:30:10(省掉了路径)意思分别是:TruSeq3-PE.fa是接头序列,2是比对时接头序列时所允许的最大错配数;30指的是要求PE的两条read同时和PE的adapter序列比对,匹配度加起来超30%,那么就认为这对PE的read含有adapter,并在对应的位置需要进行切除【注】。10和前面的30不同,它指的是,我就什么也不管,反正只要这条read的某部分和adpater序列有超过10%的匹配率,那么就代表含有adapter了,需要进行去除;

LEADING,规定read开头的碱基是否要被切除的质量阈值;

TRAILING,规定read末尾的碱基是否要被切除的质量阈值;

SLIDINGWINDOW,滑动窗口长度的参数,SLIDINGWINDOW:5:20代表窗口长度为5,窗口中的平均质量值至少为20,否则会开始切除;

MINLEN,规定read被切除后至少需要保留的长度,如果低于该长度,会被丢掉。

14. 若要将002_R1.fastq改为002_R1.fastq.gz,直接gzip 002_R2.fastq即可,若要解压,直接gunzip 002_R2.fastq.gz

trimmomatic可以对测序数据进行过滤

java -jar trimmomatic-0.35.jar PE -phred33 input_forward.fq.gz input_reverse.fq.gz output_forward_paired.fq.gz output_forward_unpaired.fq.gz output_reverse_paired.fq.gz output_reverse_unpaired.fq.gz ILLUMINACLIP:$file_path/TruSeq3-PE.fa:2:30:10 LEADING:3 TRAILING:3 SLIDINGWINDOW:4:15 MINLEN:36

运行上面的命令可以完成以下任务

Remove adapters (ILLUMINACLIP:TruSeq3-PE.fa:2:30:10) #去掉接头

Remove leading low quality or N bases (below quality 3) (LEADING:3) #去掉开头质量低于3或N碱基

Remove trailing low quality or N bases (below quality 3) (TRAILING:3) #去掉末尾质量低于3或N碱基

Scan the read with a 4-base wide sliding window, cutting when the average quality per base drops below 15 (SLIDINGWINDOW:4:15) #以4个碱基为滑动窗口对reads进行扫描,当平均质量值低于15时进行剪切

Drop reads below the 36 bases long (MINLEN:36) #去掉长度小于36的reads

如何解决 no jzmq in java.library.path

1. 确保zmq的各种library有安装正确,检查方法:查看/usr/local/lib, 看里面有没有libjzmq.a, libjzmq.dylib, libzmq.a, libjzmq.dylib等

正确的安装方法是:(1)安装libzmq-master (2)安装zeromq-3.2.4,注意版本最好选这个,试过最新版本会报错 (3)安装jzmq-master java binding

直接搜这些关键词都能找到相应地github网页或者官网,然后按步骤输指令就行

2.看看问题是不是出在java.library.path,打开 ~/.bash_profile, 加入 export LD_LIBRARY_PATH=/usr/local/lib. 或者直接在命令行里提供路径,例如:

javac -classpath /usr/local/share/java/zmq.jar HelloWorldClient.java

java -classpath .:/usr/local/share/java/zmq.jar -Djava.library.path=/usr/local/lib HelloWorldClient

zeromq java 怎么使用安装

首先

1.下载最新版的zeromq

2 解压

tar -xvf zeromq-3.1.0-beta.tar.gz

3 运行configure

./configure --prefix=/data/zeromq (prefix 指定安装目录)

4. make

5. make install

6. 设置环境变量

export CPPFLAGS=-I/home/mine/0mq/include/

export LDFLAGS=-L/home/mine/0mq/lib/

7.测试代码

server.c

#######################################

#include /data/zeromq/include/zmq.h

#include stdio.h

#include unistd.h

#include string.h

#include stdlib.h

int main (void)

{

void *context = zmq_init (1);

// Socket to talk to clients

void *responder = zmq_socket (context, ZMQ_REP);

zmq_bind (responder, "tcp://192.168.0.185:5555");

printf("binding on port 5555.\nwaiting client send message...\n");

while (1) {

// Wait for next request from client

zmq_msg_t request;

zmq_msg_init (request);

char buf[32];

zmq_recv (responder,buf, request, 0);

int size = zmq_msg_size (request);

char *string = malloc (size + 1);

memset(string,0,size+1);

memcpy (string, zmq_msg_data (request), size);

printf ("Received Hello string=[%s]\n",string);

free(string);

zmq_msg_close (request);

// Do some 'work'

sleep (1);

// Send reply back to client

zmq_msg_t reply;

char res[128]={0};

snprintf(res,127,"reply:%d",random());

zmq_msg_init_size (reply, strlen(res));

memcpy (zmq_msg_data (reply), res, strlen(res));

char buf2[32];

zmq_send (responder, buf2, reply, 0);

zmq_msg_close (reply);

}

// We never get here but if we did, this would be how we end

zmq_close (responder);

zmq_term (context);

return 0;

}

########################################################

#client.c

#include zmq.h

#include string.h

#include stdio.h

#include unistd.h

int main ()

{

void *context = zmq_init (1); // Socket to talk to server

printf ("Connecting to hello world server...\n");

void *requester = zmq_socket (context, ZMQ_REQ);

zmq_connect (requester, "tcp://192.168.0.185:5555");

int request_nbr;

for (request_nbr = 0; request_nbr != 10; request_nbr++)

{

zmq_msg_t request;

zmq_msg_init_data (request, "Hello", 6, NULL, NULL);

printf ("Sending request %d...\n", request_nbr);

zmq_send (requester, request, 0,0);

printf("send over") ;

zmq_msg_close (request);

zmq_msg_t reply;

zmq_msg_init (reply);

zmq_recv (requester, reply, 0,0);

printf ("Received reply %d: [%s]\n", request_nbr, (char *) zmq_msg_data (reply));

zmq_msg_close (reply);

}

zmq_close (requester);

zmq_term (context);

return 0;

}

gcc server.c -o server -lzmq -L/data/zeromq/lib -I/data/zeromq/include

gcc client.c -o client -lzmq -L/data/zeromq/lib -I/data/zeromq/include

./server

./client

jzmq 是zeromq 的java客户端

下载地址

1. tar xzf zeromq-jzmq-semver-90-g58c6108.tar.gz

2. ./configure

这个时候需要上面环境变量的配置,

还需要

随便

vi /data/zeromq/.bashrc

export PATH=$PATH:/data/zeromq/include

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/data/zeromq/lib:/data/zeromq/include

只要configure 执行完毕就会生成makefile文件

3.make

4.make install

测试

hwserver.java

//

// Hello World server in Java

// Binds REP socket to tcp://*:5555

// Expects "Hello" from client, replies with "World"

//

// Naveen Chawla naveen.chwl@gmail.com

//

import org.zeromq.ZMQ;

public class hwserver {

public static void main(String[] args) {

// Prepare our context and socket

ZMQ.Context context = ZMQ.context(1);

ZMQ.Socket socket = context.socket(ZMQ.REP);

socket.bind ("tcp://*:5555");

while (true) {

byte[] request;

// Wait for next request from client

// We will wait for a 0-terminated string (C string) from the client,

// so that this server also works with The Guide's C and C++ "Hello World" clients

request = socket.recv (0);

// In order to display the 0-terminated string as a String,

// we omit the last byte from request

System.out.println ("Received request: [" +

new String(request,0,request.length-1) // Creates a String from request, minus the last byte

+ "]");

// Do some 'work'

try {

Thread.sleep (1000);

}

catch(InterruptedException e){

e.printStackTrace();

}

// Send reply back to client

// We will send a 0-terminated string (C string) back to the client,

// so that this server also works with The Guide's C and C++ "Hello World" clients

String replyString = "World" + " ";

byte[] reply = replyString.getBytes();

reply[reply.length-1]=0; //Sets the last byte of the reply to 0

socket.send(reply, 0);

}

}

}

hwclient.java

//

// Hello World client in Java

// Connects REQ socket to tcp://localhost:5555

// Sends "Hello" to server, expects "World" back

//

// Naveen Chawla naveen.chwl@gmail.com

//

import org.zeromq.ZMQ;

public class hwclient{

public static void main(String[] args){

// Prepare our context and socket

ZMQ.Context context = ZMQ.context(1);

ZMQ.Socket socket = context.socket(ZMQ.REQ);

System.out.println("Connecting to hello world server...");

socket.connect ("tcp://localhost:5555");

// Do 10 requests, waiting each time for a response

for(int request_nbr = 0; request_nbr != 10; request_nbr++) {

// Create a "Hello" message.

// Ensure that the last byte of our "Hello" message is 0 because

// our "Hello World" server is expecting a 0-terminated string:

String requestString = "Hello" + " ";

byte[] request = requestString.getBytes();

request[request.length-1]=0; //Sets the last byte to 0

// Send the message

System.out.println("Sending request " + request_nbr + "...");

socket.send(request, 0);

// Get the reply.

byte[] reply = socket.recv(0);

// When displaying reply as a String, omit the last byte because

// our "Hello World" server has sent us a 0-terminated string:

System.out.println("Received reply " + request_nbr + ": [" + new String(reply,0,reply.length-1) + "]");

}

}

}

javac -classpath /data/jzmq/share/java/zmq.jar -d . h*.java

java -Djava.library.path=/data/jzmq/lib -cp /data/jzmq/share/java/zmq.jar:. hwserver

java -Djava.library.path=/data/jzmq/lib -cp /data/jzmq/share/java/zmq.jar:. hwclient

显示内容:

server端

Received request: [Hello]

Received request: [Hello]

Received request: [Hello]

Received request: [Hello]

Received request: [Hello]

Received request: [Hello]

client端

Connecting to hello world server...

Sending request 0...

Received reply 0: [World]

Sending request 1...

Received reply 1: [World]

Sending request 2...

Received reply 2: [World]

Sending request 3...

Received reply 3: [World]

Sending request 4...

Received reply 4: [World]

Sending request 5...

关于zmq教程java和zmq安装的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。