TCP编程时,recv()函数默认阻塞等待,返回socket携带的信息,要根据业务场景设计recv的等待和结束机制:
recv阻塞,以接收空字符串结束
- 如下TcpServer.py,为通常的recv机制:
- 因为客户端单次send数据长度可能超过设置的1024,所以把recv放到循环体内,以保证接收数据流的完整性。
- 但是不可能让recv一直阻塞等待这里,通常的做法就是判断数据长度为空则退出循环
- 在正常传输数据时,recv接收的不可能为空,也就无法触发break退出循环recv
- 需要额外发送一次,携带空字符串的请求,用来触发break关键字
import socket address = ("0.0.0.0", 12346) def tcp_server(): server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_socket.bind(address) server_socket.listen(5) print("TcpServer开始监听:{}".format(address)) while True: client_socket, client_address = server_socket.accept() data = str() while True: msg = client_socket.recv(1024) data += msg if not len(msg): break