zmq.push/pull java_ZeroMQ之push/pull模式 | 学步园

本文介绍了Java中使用ZeroMQ库实现Push/Pull模式进行服务器与客户端间的消息通信。Push角色用于发送消息,通过绑定端口;Pull角色用于接收消息,通过连接到服务器。示例代码展示了如何创建Push服务器和两个Pull客户端,消息发送有序且仅被一个客户端消费,适合多消费者场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

PUHS: 用于发送消息,定义一个zeromq的socket实例,用于send msg

PULL: 用于接收消息,recv msg

用于服务器与客户端消息通信。

下面是服务器给客户端发送消息的代码,服务器PUSH(绑定一个端口号),客户端PULL(连接服务器)

服务器端代码

Java代码 75b651601b8079ff4f7478fdb7333673.gif 2b988f4bfbe72f3367a93cbb8c456496.png

c9c97382e3b4af955febe5a7a7cea4e8.gif

package pushpull;

import org.zeromq.ZMQ;

public class Push {

public static void main(String[] args) throws InterruptedException {

// TODO Auto-generated method stub

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

ZMQ.Socket sender = context.socket(ZMQ.PUSH);

sender.bind("tcp://*:5557");

int i = 0;

while (true) {

Thread.currentThread().sleep(2000);

i++;

sender.send(("msg" + i).getBytes(), 0);

}

}

}

package pushpull;import org.zeromq.ZMQ;public class Push { public static void main(String[] args) throws InterruptedException {// TODO Auto-generated method stubZMQ.Context context = ZMQ.context(1);ZMQ.Socket sender = context.socket(ZMQ.PUSH);sender.bind("tcp://*:5557");int i = 0;while (true) { Thread.currentThread().sleep(2000); i++; sender.send(("msg" + i).getBytes(), 0);} }}

客户端A的代码

Java代码 75b651601b8079ff4f7478fdb7333673.gif 2b988f4bfbe72f3367a93cbb8c456496.png

c9c97382e3b4af955febe5a7a7cea4e8.gif

package pushpull;

import org.zeromq.ZMQ;

public class PullA {

public static void main(String[] args) {

// TODO Auto-generated method stub

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

ZMQ.Socket receiver = context.socket(ZMQ.PULL);

receiver.connect("tcp://localhost:5557");

while (true) {

//  String msg = new String(receiver.recv(0));

System.out.println(new String(receiver.recv(0)));

}

}

}

package pushpull;import org.zeromq.ZMQ;public class PullA { public static void main(String[] args) {// TODO Auto-generated method stubZMQ.Context context = ZMQ.context(1);ZMQ.Socket receiver = context.socket(ZMQ.PULL);receiver.connect("tcp://localhost:5557");while (true) { // String msg = new String(receiver.recv(0)); System.out.println(new String(receiver.recv(0)));} }}

客户端B的代码

Java代码 75b651601b8079ff4f7478fdb7333673.gif 2b988f4bfbe72f3367a93cbb8c456496.png

c9c97382e3b4af955febe5a7a7cea4e8.gif

package pushpull;

import org.zeromq.ZMQ;

public class PullB {

public static void main(String[] args) {

// TODO Auto-generated method stub

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

ZMQ.Socket receiver = context.socket(ZMQ.PULL);

receiver.connect("tcp://localhost:5557");

while (true) {

System.out.println(new String(receiver.recv(0)));

}

}

}

package pushpull;import org.zeromq.ZMQ;public class PullB { public static void main(String[] args) {// TODO Auto-generated method stubZMQ.Context context = ZMQ.context(1);ZMQ.Socket receiver = context.socket(ZMQ.PULL);receiver.connect("tcp://localhost:5557");while (true) { System.out.println(new String(receiver.recv(0)));} }}

客户端A接受的消息是

Java代码 75b651601b8079ff4f7478fdb7333673.gif 2b988f4bfbe72f3367a93cbb8c456496.png

c9c97382e3b4af955febe5a7a7cea4e8.gif

msg5

msg7

msg9

msg11

...

msg5 msg7 msg9 msg11 ...

客户端B接收的消息是

Java代码 75b651601b8079ff4f7478fdb7333673.gif 2b988f4bfbe72f3367a93cbb8c456496.png

c9c97382e3b4af955febe5a7a7cea4e8.gif

msg1

msg2

msg3

msg4

msg6

msg8

msg10

...

msg1msg2 msg3 msg4 msg6 msg8 msg10...

可以看出push/pull模式是单向的,很适合消费者能力不足的情况,可以提供多个消费者。一条消息如果被A消费,B将不会再消费这条消息。

如果客户端给服务器发送消息,则服务器PULL(绑定一个端口号),客户端PUSH(连接服务器)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值