Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在PyZMQ中发送空消息_Python_Zeromq_Pyzmq - Fatal编程技术网

Python 在PyZMQ中发送空消息

Python 在PyZMQ中发送空消息,python,zeromq,pyzmq,Python,Zeromq,Pyzmq,我试图将下面的示例HTTP服务器翻译成Python,该服务器基于用C编写的0MQ def test_http_socket(): ctx = zmq.Context() sock = ctx.socket(zmq.ROUTER) sock.setsockopt(zmq.ROUTER_RAW, 1) sock.bind("tcp://*:8080") while True: id_bytes = sock.recv() pri

我试图将下面的示例HTTP服务器翻译成Python,该服务器基于用C编写的0MQ

def test_http_socket():
    ctx = zmq.Context()
    sock = ctx.socket(zmq.ROUTER)
    sock.setsockopt(zmq.ROUTER_RAW, 1)
    sock.bind("tcp://*:8080")
    while True:
        id_bytes = sock.recv()
        print("id=",id_bytes)
        request = sock.recv()
        print("request=",request)
        if b'/close' in request:
            return
        sock.send(id_bytes, zmq.SNDMORE)
        sock.send(b"""HTTP/1.0 200 OK
Content-Type: text/plain

Hello, world !""")
        sock.send(zmq.NULL)
问题在下一行,我尝试翻译C表达式

zmq_send (router, NULL, 0, 0);
在Python中,我有以下堆栈跟踪:

Traceback (most recent call last):
  File "<pyshell#96>", line 1, in <module>
    test_http_socket()
  File "<pyshell#95>", line 18, in test_http_socket
    sock.send(zmq.NULL)
  File "socket.pyx", line 565, in zmq.backend.cython.socket.Socket.send     (zmq\backend\cython\socket.c:5104)
  File "socket.pyx", line 612, in zmq.backend.cython.socket.Socket.send (zmq\backend\cython\socket.c:4868)
  File "socket.pyx", line 168, in zmq.backend.cython.socket._send_copy (zmq\backend\cython\socket.c:1914)
  File "buffers.pxd", line 200, in buffers.asbuffer_r (zmq\backend\cython\socket.c:6833)
  File "buffers.pxd", line 151, in buffers.asbuffer (zmq\backend\cython\socket.c:6270)
TypeError: 0 does not provide a buffer interface.
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
测试\u http\u套接字()
文件“”,第18行,在测试\u http\u套接字中
sock.send(zmq.NULL)
zmq.backend.cython.socket.socket.send(zmq\backend\cython\socket.c:5104)中的文件“socket.pyx”,第565行
zmq.backend.cython.socket.socket.send(zmq\backend\cython\socket.c:4868)中的文件“socket.pyx”,第612行
文件“socket.pyx”,第168行,在zmq.backend.cython.socket中。发送副本(zmq\backend\cython\socket.c:1914)
文件“buffers.pxd”,第200行,在buffers.asbuffer\r(zmq\backend\cython\socket.c:6833)中
文件“buffers.pxd”,第151行,在buffers.asbuffer(zmq\backend\cython\socket.c:6270)中
TypeError:0不提供缓冲区接口。
实际上,sock.send只能用于发送缓冲区或消息。 是否有一种方法可以使用0MQ的zmq_send以Python的另一种方式发送空帧

顺便说一下,中的注释表明,即使在C中,它也可能无法关闭与客户端的连接。 如何要求远程客户端关闭其连接(在Python中)


我在Windows 32位上的Python 3.3.2上使用libzmq 4.0.1和PyZMQ 14.0.1。

第一点:
zmq.NULL
是用于zeromq安全机制的
zmq\u NULL
常量。例如:

socket.mechanism = zmq.NULL # or zmq.PLAIN or zmq.CURVE
它不是
NULL
特殊C常量

要发送空消息,只需发送空bytestring:

socket.send(b'')
第二点是,您需要将空帧作为单独的消息发送,但您没有这样做。 以下是一个工作示例:

def http_hello_world():
    ctx = zmq.Context()
    sock = ctx.socket(zmq.ROUTER)
    sock.router_raw = True
    sock.bind("tcp://*:8080")
    while True:
        id_bytes, request = sock.recv_multipart()
        print("id: %r" % id_bytes)
        print("request:", request.decode('utf8'))
        if b'/close' in request:
            return

        # send the body of the response
        sock.send_multipart([
            id_bytes,
b"""HTTP/1.0 200 OK
Content-Type: text/plain

Hello, world!
"""
        ])
        # send an empty message to finish the response
        sock.send_multipart([
            id_bytes,
            b''
        ])
顺便说一句,Github条目中的一条注释表明,即使在C中,它也可能无法关闭与客户端的连接。我如何要求远程客户端关闭其连接(在Python中)


我认为,只要您发送空帧来终止消息,连接就应该关闭。

我今天早上考虑过,在重新发送空帧之前尝试发送id_字节。我回到Stackoverflow只是为了以防万一,你提供的正是我所想的。而且它工作得很好!非常感谢。感谢您对zmq.NULL的解释。