为啥 ZeroMQ 服务器没有收到来自客户端的任何请求?

Posted

技术标签:

【中文标题】为啥 ZeroMQ 服务器没有收到来自客户端的任何请求?【英文标题】:Why a ZeroMQ Server does not receive any requests from Client?为什么 ZeroMQ 服务器没有收到来自客户端的任何请求? 【发布时间】:2020-05-07 20:37:56 【问题描述】:

我在MQL4(类似 c++ 的语言)中设置了 ZeroMQ 服务器,并在 Python 中设置了 ZeroMQ 客户端。由PUSH/PULL-sockets 构成的连接运行良好,但是当我尝试使用 REQ-socket 从 Python 向 ZeroMQ REP-socket 发送请求时,它什么也没收到。这是 Python 代码:

    reqSocket.connect( "tcp://locahost:%d" % REQ_PORT )

    jsonMsg = json.dumps( requestMessage )

    socket.send_string( jsonMsg )
    print( "Sent a message" )

    response = socket.recv()
    print( "received a message" )

这是MQL4 代码:

    repSocket.bind( StringFormat( "%s://%s:%d",
                                   ZEROMQ_PROTOCOL,
                                   HOSTNAME,
                                   REP_PORT
                                   )
                    );
    repSocket.recv( request, true );

    if( request.size() > 0 ) 

        string reply = MessageHandler( request );
        Print( reply );
        repSocket.send( reply );
        

我毫不怀疑套接字连接正确,因为我有 PUSH/PULL 套接字以相同的方式连接并且工作正常。

【问题讨论】:

【参考方案1】:

为什么ZeroMQ服务器没有收到来自客户端的任何请求?”

因为源代码发送任何

reqSocket.connect( "tcp://locahost:%d" % REQ_PORT )
#^^^^^^^^._____________________________________________________SOCKET.connect()-s
jsonMsg = json.dumps( requestMessage )
pass;      socket.send_string( jsonMsg ); print( "Sent" )
response = socket.recv();
#          ^^^^^^.____________________________________other_one_.send|recv()-es

socket.send_string( jsonMsg )这不是发送请求吗? 顺便说一句 socket = reqSocket(在函数内作为变量传递,所以这不是问题)– blennd 1 小时前

真是一场讲座!

@blennd 如果你对一些信息争论不休,认为你没有在 MCVE 中发帖,你可能会鄙视那些赞助他们的时间和知识试图帮助你的人。对于这个社区来说是一种相当反模式,与网站文化完全相反。


下一个候选者——如果一个socket-object实际上是一个偷偷改过的reqSocket-instance:

也许,调用 .connect() 方法时应该更加小心,使用 "tcp://locaLhost:%d" % REQ_PORT,不是吗?

完全准备好听到,您的 DNS 表已经设置并处于活动状态,可以顺利地将 locahost 符号主机名转换为 @ 987654331@ 和许多其他象征性的名字, 就在太平洋的这一边,似乎很明显,至少到目前为止是这样:o)

【讨论】:

socket.send_string(jsonMsg)。这不是发送请求吗? BTW socket = reqSocket(作为函数内部的变量传递,所以这不是问题)【参考方案2】:

我的代码:

    Context *context;
    Socket *rec;

    string ZEROMQ_PROTOCOL = "tcp";
    string HOSTNAME = "127.0.0.1";
    #define REP_PORT 55555
...
   context=new Context();   // <-- mayby u a forget
   rec= new Socket(context,ZMQ_REQ);
   rec.setReceiveTimeout(500);
   cConnect = StringFormat( "tcp://%s:%s",HOSTNAME,REP_PORT);
   rec.connect(cConnect);

【讨论】:

以上是关于为啥 ZeroMQ 服务器没有收到来自客户端的任何请求?的主要内容,如果未能解决你的问题,请参考以下文章

C#异步套接字服务器没有收到来自Java客户端的响应

具有 REQ 和 REP 套接字的 C++ ZeroMQ 单一应用程序

ZeroMQ:如何获取连接客户端的地址?

确定REQ-REP ZeroMQ应用程序客户端发出请求的端口,服务器绑定到两个端点(端口号)?

Python GUI 未捕获 zeromq 消息

ZeroMQ - 为一台服务器模拟多个客户端的标准套接字