ZeroMQ (cppzmq) 订阅者,过滤器以相同的字符串开头
ZeroMQ (cppzmq) subscriber with filters which start with the same string
我在示例发布者中使用了两个主题。两者都以相同的字符串开头。当我仅使用两个主题之一过滤订阅服务器中的消息时,订阅者会收到两个主题
如果我使用两个不同的主题,它可以工作
我的示例发布者
try (ZContext context = new ZContext()) {
final ZMQ.Socket socket = context.createSocket(SocketType.PUB);
socket.bind("tcp://*:5555");
int i = 0;
while (!Thread.currentThread().isInterrupted() && !stopped) {
logger.debug("sending C1 message");
final String env = "topic";
final String msg = "Hello, world #" + i++;
socket.sendMore(env);
socket.send(msg);
logger.debug("sending C2 message");
final String env2 = "topic2";
final String msg2 = "Hello, world #" + i++;
socket.sendMore(env2);
socket.send(msg2);
try {
sleep(5000);
} catch (final InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
和我的示例订阅者:
zmq::context_t ctx;
zmq::socket_t sock(ctx, zmq::socket_type::sub);
sock.connect("tcp://127.0.0.1:5555");
std::string filter="topic";
sock.setsockopt(ZMQ_SUBSCRIBE,filter.c_str(),filter.length());
while(true) {
zmq::message_t env;
sock.recv(&env);
std::string env_str = std::string(static_cast<char*>(env.data()), env.size());
std::cout << "Received Enveloppe '" << env_str << "'" << std::endl;
zmq::message_t msg;
sock.recv(&msg);
std::string msg_str = std::string(static_cast<char*>(msg.data()), msg.size());
std::cout << "Received '" << msg_str << "'" << std::endl;
}
我的订阅者应仅显示与主题"主题"关联的消息,而不是两者。
语句 : "我的订阅者应该只显示与主题"主题"关联的消息,而不是两者。
不正确,恰恰相反。
文档对此很清楚。ZeroMQ API 明确声明:
非空
option_value
应订阅以指定前缀开头的所有消息。可以将多个过滤器连接到单个ZMQ_SUB套接字,在这种情况下,如果消息与至少一个过滤器匹配,则应接受该消息。
+-----------------------+---------------+
|期权值类型 | 二进制数据 |
+-----------------------+---------------+
示例:一条消息,在PUB
端调度为:
PUB.send( "123456------------" );
将在以下任一订阅的SUB
-s 上获得.recv()
-ed:
SUB.setsockopt( zmq.SUBSCRIBE, "" ); // this one .recv()-es EVERY message
SUB.setsockopt( zmq.SUBSCRIBE, "1" ); // this one .recv()-es "1{0+[*]}"
SUB.setsockopt( zmq.SUBSCRIBE, "12" ); // this one .recv()-es "12{0+[*]}"
SUB.setsockopt( zmq.SUBSCRIBE, "123" );// this one .recv()-es "123{0+[*]}"
相关文章:
- 在 C++11 中,如何查找并返回以给定字符串开头的字符串向量中的所有项?
- 字符串开头的分隔符
- 如何使字符串出现在编译的二进制可执行文件的开头?
- 如何在 Arduino 字符串的开头添加元素.类似于 JS unshift();
- 为什么使用 QString::right 在字符串开头省略逗号?
- 如何在 的开头<x>和结尾<y>之间更改带有文件输出的字符串的值
- 如何在C++中.txt文件的开头插入字符串
- 提升精神解析字符串以前缀开头
- 如何仅在以给定数量的整数开头时解析字符串
- 是什么使这个以'+'开头的字符串添加成为有效的语句?
- cout 切断 for 循环中的字符串开头
- 如何从字符串开头到第二个分隔符中提取子字符串?
- ZeroMQ (cppzmq) 订阅者,过滤器以相同的字符串开头
- 如何检查 std::vector<std::string> 的元素是否以某个子字符串开头?
- 如何输入以特殊字符开头的字符串
- C++从文件中读取不同类型的数据,直到有一个以数字开头的字符串
- 如何使用正则表达式匹配不包含特殊字符(&、\、<、>、|、)的字符串,除非它们以反斜杠开头
- 如何在 qt 中使用 QRegularExpression 匹配字符串开头的空格?
- DeleteFile,以子字符串开头
- 如何检查字符串的内容是否以另一个字符串的内容开头