我正在尝试使用 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();
}}
但是服务器似乎没有收到任何东西。知道我哪里出错了吗?
您不应在模拟器中使用
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");