【问题标题】:Why a ZeroMQ example does not work?为什么 ZeroMQ 示例不起作用?
【发布时间】:2018-11-14 11:41:54
【问题描述】:

我是 Python/ZeroMQ 的新手,所以如果这是一个简单的问题,请耐心等待。

我尝试运行一些示例,但效果并不好。
以下是 ZeroMQ-Guide 的 hwserver/hwclient 示例:


服务器

#   Hello World server in Python
#   Binds REP socket to tcp://*:5555
#   Expects b"Hello" from client, replies with b"World"
#

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

while True:

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

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

    print( "teeest" )

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

客户

#    Hello World client in Python
#    Connects REQ socket to tcp://localhost:5555
#    Sends "Hello" to server, expects "World" back
#

import zmq

context = zmq.Context()

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


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

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

我得到了这个输出:

Connecting to hello world server…
Sending request 0 …
Received reply 0 [ b'World' ]
Sending request 1 …
Received reply 1 [ b'World' ]
Sending request 2 …
Received reply 2 [ b'World' ]
Sending request 3 …
Received reply 3 [ b'World' ]
Sending request 4 …
Received reply 4 [ b'World' ]
Sending request 5 …
Received reply 5 [ b'World' ]
Sending request 6 …
Received reply 6 [ b'World' ]
Sending request 7 …
Received reply 7 [ b'World' ]
Sending request 8 …
Received reply 8 [ b'World' ]
Sending request 9 …
Received reply 9 [ b'World' ]

Process finished with exit code 0

有人能告诉我为什么我没有得到像“Received request”和“teeeest”这样的服务器打印吗?

谢谢!

【问题讨论】:

    标签: python zeromq


    【解决方案1】:

    为什么我没有得到像“Received request”和“teeeest”这样的服务器打印信息?

    嗯,
    你真的得到了他们,
    但是因为您没有查看右侧(两者)地点(如果还从服务器端 PyCharm/终端窗口读取,您将看到它们 -- 这是个好消息)。

    欢迎来到 。让两个“角色”一起跳舞(如 REQ/REP 或其他 ZeroMQ Scalable Formal Communication Pattern Archetypes 中的编码),您必须检查 distributed-dancing 的双方strong> 以查看全貌。

    只看一面会让你没有完整的故事。

    为了更容易看到,让我们稍微修改一下代码:


    服务器模组:

    import time
    import zmq
    context = zmq.Context()
    socket  = context.socket( zmq.REP ); socket.bind( "tcp://*:5555" )
    
    while True:
        message = socket.recv()               #  Wait for next request from client
        print( "TERMINAL[1]: SERVER has received request: %s" % message )
        time.sleep(1)                         #  Do some 'work'
        print( "TERMINAL[1]: SERVER puts teeest......................." )
    
        socket.send( b"World" )               #  Send reply back to client
    

    客户端模组:

    import zmq
    
    context = zmq.Context()
    
    print( "TERMINAL[2] CLIENT says Connecting to hello world server…" )    
    
    socket = context.socket( zmq.REQ )            #  Socket to talk to server
    socket.connect( "tcp://localhost:5555" )
    
    for request in range( 10 ):                   #  Do 10 requests,
        #                                         #  waiting each time for a response
        print( "TERMINAL[2] CLIENT Sending request %s …" % request )
        socket.send( b"Hello" )
    
        message = socket.recv()                   #  Get the reply.
        print( "TERMINAL[2] CLIENT Received reply %s [ %s ]" % ( request, message ) )
    

    而这个输出你已经“知道”了:

    TERMINAL[2] CLIENT says Connecting to hello world server…
    TERMINAL[2] CLIENT Sending request 0 …
    TERMINAL[2] CLIENT Received reply 0 [ b'World' ]
    TERMINAL[2] CLIENT Sending request 1 …
    TERMINAL[2] CLIENT Received reply 1 [ b'World' ]
    TERMINAL[2] CLIENT Sending request 2 …
    TERMINAL[2] CLIENT Received reply 2 [ b'World' ]
    TERMINAL[2] CLIENT Sending request 3 …
    TERMINAL[2] CLIENT Received reply 3 [ b'World' ]
    TERMINAL[2] CLIENT Sending request 4 …
    TERMINAL[2] CLIENT Received reply 4 [ b'World' ]
    TERMINAL[2] CLIENT Sending request 5 …
    TERMINAL[2] CLIENT Received reply 5 [ b'World' ]
    TERMINAL[2] CLIENT Sending request 6 …
    TERMINAL[2] CLIENT Received reply 6 [ b'World' ]
    TERMINAL[2] CLIENT Sending request 7 …
    TERMINAL[2] CLIENT Received reply 7 [ b'World' ]
    TERMINAL[2] CLIENT Sending request 8 …
    TERMINAL[2] CLIENT Received reply 8 [ b'World' ]
    TERMINAL[2] CLIENT Sending request 9 …
    TERMINAL[2] CLIENT Received reply 9 [ b'World' ]
    

    所以,
    接下来看看另一个窗口/终端,
    您将在其中看到所有预期的 SERVER 端 print()-s:

    TERMINAL[1]: SERVER has received request: b'Hello'
    TERMINAL[1]: SERVER puts teeest.......................
    TERMINAL[1]: SERVER has received request: b'Hello'
    TERMINAL[1]: SERVER puts teeest.......................
    TERMINAL[1]: SERVER has received request: b'Hello'
    TERMINAL[1]: SERVER puts teeest.......................
    TERMINAL[1]: SERVER has received request: b'Hello'
    TERMINAL[1]: SERVER puts teeest.......................
    TERMINAL[1]: SERVER has received request: b'Hello'
    TERMINAL[1]: SERVER puts teeest.......................
    TERMINAL[1]: SERVER has received request: b'Hello'
    TERMINAL[1]: SERVER puts teeest.......................
    ...
    

    有兴趣尽快掌握 ZeroMQ 吗?

    可能享受另外 5 秒的阅读
    关于 [ ZeroMQ hierarchy in less than a five seconds ] 或此处的其他帖子和讨论中的主要概念差异。

    【讨论】:

      【解决方案2】:

      打印teeest的不是客户端而是服务器,因为print( "teeest" )被指示在服务器文件中执行。

      您的输出显示的是客户端的输出,而不是服务器的输出。

      【讨论】:

      • 好的,如何同时从两个文件中获取输出?
      • 先在一个终端运行server.py,然后在另一个终端运行client.py。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-09-05
      • 2016-02-18
      • 2011-06-06
      • 2020-02-18
      • 2011-04-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多