Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/291.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 由于某种原因,套接字会阻塞发送_Python_Sockets - Fatal编程技术网

Python 由于某种原因,套接字会阻塞发送

Python 由于某种原因,套接字会阻塞发送,python,sockets,Python,Sockets,尝试使用SocketServer通过原始套接字实现压缩通信。我的处理程序类这样做是为了读取 raw_message = [] while True: data = self.request.recv(1024) if not data: break raw_message.append(data) raw_message = ''.join(raw_message) 原始消

尝试使用SocketServer通过原始套接字实现压缩通信。我的处理程序类这样做是为了读取

raw_message = [] while True: data = self.request.recv(1024) if not data: break raw_message.append(data) raw_message = ''.join(raw_message) 原始消息=[] 尽管如此: data=self.request.recv(1024) 如果没有数据: 打破 原始消息。追加(数据) 原始消息=''.join(原始消息) 然后它试着解压并给我回复。我的客户端代码是这样的

try: sock.connect(('myhost', 8075)) except Exception as e: print('failed to connect', e) compressed = zlib.compress(bytes(payload, 'utf-8')) print('payload length: ', len(payload)) print('compressed length: ', len(compressed)) try: sock.sendall(compressed) except Exception as e: print('failed to send', e) print('sent') data = sock.recv(4096) print('data: ', zlib.decompress(data)) 尝试: sock.connect(('myhost',8075)) 例外情况除外,如e: 打印('连接失败',e) compressed=zlib.compress(字节(有效负载,'utf-8')) 打印('有效负载长度:',长度(有效负载)) 打印('压缩长度:',长度(压缩)) 尝试: sock.sendall(压缩) 例外情况除外,如e: 打印('发送失败',e) 打印('已发送') 数据=sock.recv(4096) 打印('数据:',zlib.解压缩(数据)) 不知何故,服务器永远不会脱离“while True:”循环,即使每个教程都说它应该以这种方式工作。我做错了什么


编辑:看起来通过单个套接字进行连续通信需要一点计划,两端都知道通信何时开始和停止。我原以为这会由send()和recv()处理,但显然不是这样。

当然,它永远不会结束。这就是为什么我们使用while True。何时结束循环?是否看到if not数据:break?我希望循环在客户端完成发送时结束。客户端需要使用socket.shutdown(而不是socket.close,它关闭套接字的读/写部分)通知它已完成发送。你的情况还不够。它只在没有数据要发送的情况下工作。如果我关闭写套接字,如何再次发送数据?客户端套接字通常只用于一次交换(或一小部分顺序交换)。请看一看:当然,它永远不会结束。这就是为什么我们使用while True。何时结束循环?是否看到if not数据:break?我希望循环在客户端完成发送时结束。客户端需要使用socket.shutdown(而不是socket.close,它关闭套接字的读/写部分)通知它已完成发送。你的情况还不够。它只在没有数据要发送的情况下工作。如果我关闭写套接字,如何再次发送数据?客户端套接字通常只用于一次交换(或一小部分顺序交换)。请看一看: