0

我有一个用 Java 编写的程序,它应该通过它发送消息,ZeroMQ以便由我正在运行的另一个程序收听和响应。

问题是侦听器在本地网络上的另一台计算机上,我需要以某种方式执行端口转发,ZeroMQ以便通过网络接收消息。

    ZMQ.Context context = ZMQ.context(1);
    ZMQ.Socket requester = context.socket(ZMQ.REQ);
    requester.connect("tcp://192.168.78.14:5570"); //192.168.78.14 is the address of listening machine

    String msg = "Message";
    requester.send(msg.getBytes());

    byte[] reply = requester.recv();

运行上述代码时,程序会无限期地等待响应(永远不会出现),因此实际上是无响应的。侦听器正在侦听tcp://127.0.0.1:5570消息。将其设置为tcp://0.0.0.0:5570tcp://*:5570应该打开侦听给定端口上的所有地址也不会产生任何结果。

任何帮助表示赞赏。

4

1 回答 1

1

这个解决方案已经在生产环境中使用了大约 20 年,因为大量空间分布的虚拟机需要让类似host:port的会话生效,而与它们在各自的真实网络地址空间中的实际实例无关


在主机之间使用ssh-port-forwarding隧道

该解决方案原则上独立于ZeroMQ框架设置。

在您希望的两台主机之间设置实时 SSH 连接。

在每一端,根据通信设置中使用的 -s提供各自的端口转发映射。port#ZeroMQ

将本地端口转发到远程目标host A 192.168.78.145570IP:port#

L5570 forward to 192.168.78.15:5570

在-communicating 模式上,本地端口透明地“说话” ,这是由 -tunnel 的服务host A转发到对端,主机并传递到那里引用的端口以进行进一步的套接字流量处理。ZeroMQ5570sshB5570

在-communicating 模式上,通过port 无缝“交互” ,就好像通信对方“坐在”同一个“盒子”中一样,并处理通过-tunnel 实际传递的套接字流量,而不知道这种技巧。host B 192.168.78.15ZeroMQ5570ssh

QED。


为了更快、更容易地进行原型设计,人们可能会选择使用相当.socket(ZMQ.PAIR)原型,它不会引入任何高级ZeroMQ行为模式,并且只需将套接字接口指示发送的任何内容发送到另一端(无需等待REP-reply to prior REQ-信息 )

于 2015-10-21T18:59:38.927 回答