JeroMQ - 从 Java 客户端向 Python 服务器发送消息

问题描述 投票:0回答:1

我正在尝试使用 JeroMQ 将消息从 Android Java 客户端发送到使用 ZeroMQ 的 Python 服务器。我在同一台机器上运行服务器和客户端。服务器在 Jupyter Notebook 中运行,而客户端在 Android studio 上的 Android 设备模拟器中运行。代码如下。 Python 服务器:

context = zmq.Context()
socket = context.socket(zmq.REP)
socket.bind("tcp://*:5555")

while True:
    #  Wait for next request from client
    message = socket.recv_json()
    print("Received request: %s" % message)

    #  Do some 'work'
    time.sleep(1)

    #  Send reply back to client
    socket.send(b"World")

这是Python客户端(可以运行):

context = zmq.Context()

#  Socket to talk to server 
print("Connecting to hello world server…") 
socket = context.socket(zmq.REQ) 
socket.connect("tcp://localhost:5555")

#  Do 10 requests, waiting each time for a response for request in range(3):
    print("Sending request %s …" % request)
    socket.send(b"Hellos")

    #  Get the reply.
    message = socket.recv()
    print("Received reply %s [ %s ]" % (request, message))

这是我在 Java 客户端中尝试做同样的事情:

public class MainActivity extends AppCompatActivity {

private final String TAG = "MainActivity";
private ZMQ.Socket req;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Thread thread = new Thread(new Runnable() {
        @Override
        public void run() {
            try  {
                try (ZContext context = new ZContext()) {
                    //  Socket to talk to server
                    req = context.createSocket(SocketType.REQ);
                    req.connect("tcp://localhost:5555");

                    for (int i = 0; i == 3; i++) {
                        req.send("Hello, this is from Java");
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });

    thread.start();
}}

但是服务器似乎没有收到任何东西。知道我哪里出错了吗?

java python android zeromq jeromq
1个回答
0
投票

您不应在模拟器中使用

localhost
,而应使用
10.0.2.2
,它是主机环回接口的特殊别名(开发计算机上的
127.0.0.1
localhost
)。我相信端口
5555
已在模拟器上保留,因此您可以使用其他端口,例如
4711
。检查 Android 开发者网络页面以获取更多信息。

所以主机上的服务器应该调用:

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

模拟器上的客户端应该调用:

req.connect("tcp://10.0.2.2:4711");
© www.soinside.com 2019 - 2024. All rights reserved.