我有一个简单的TCP服务器和客户端。客户端接收数据:
received = sock.recv(1024)
这似乎微不足道,但我无法弄清楚如何接收比缓冲区更大的数据。我尝试将数据分块并从服务器发送多次(为UDP工作),但它只是告诉我我的管道坏了。
建议?
答案 0 :(得分:1)
如果您不知道有多少数据要通过套接字,并且您只是想在套接字关闭之前读取所有内容,那么您需要将socket.recv()
置于循环中:
# Assumes a blocking socket.
while True:
data = sock.recv(4096)
if not data:
break
# Do something with `data` here.
答案 1 :(得分:1)
迈克的答案是你正在寻找的答案,但这不是你想要发现自己的情况。你应该开发一种使用固定长度字段的线上协议,该字段描述了数据的进展情况被发送。这是一个Type-Length-Value协议,您可以在网络协议中一次又一次地找到它。它可以为您的协议提供针对不可预见的要求,并有助于将网络传输问题与程序化问题隔离开来。
发送方变得类似:
socket.write(struct.pack("B", type) #send a one-byte msg type
socket.write(struct.pack("H", len(data)) #send a two-byte size field
socket.write(data)
接收方如下:
type = socket.read(1) # get the type of msg
dataToRead = struct.unpack("H", socket.read(2))[0] # get the len of the msg
data = socket.read(dataToRead) # read the msg
if TYPE_FOO == type:
handleFoo(data)
elif TYPE_BAR == type:
handleBar(data)
else:
raise UnknownTypeException(type)
您最终会得到一种类似于以下内容的线上消息格式:
struct {
unsigned char type;
unsigned short length;
void *data;
}
答案 2 :(得分:0)
请记住:
话虽如此,看到围绕这一行的代码真的很有帮助。有一些事情可以发挥作用,如果你使用select或只是轮询,套接字是非阻塞等等。
如果您的远程终端断开连接,那么您发送数据的方式也很重要。更多细节。