我有一个用 C 编写的服务器,我想用 python 编写一个客户端。当 python 客户端想要发送文件时,它会发送一个字符串“send some_file”,后跟文件的内容和字符串“end some_file”。这是我的客户端代码:
file = sys.argv[1]
host = sys.argv[2]
port = int(sys.argv[3])
sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock.connect((host,port))
send_str = "send %s" % file
end_str = "end %s" % file
sock.send(send_str)
sock.send("\n")
sock.send(open(file).read())
sock.send("\n")
sock.send(end_str)
sock.send("\n")
问题是这样的:
在服务器代码中,缓冲区的大小是 4096。我第一次注意到这个错误是在尝试发送小于 4096k 的文件时。
如何确保服务器独立接收字符串?
使用套接字编程,即使您进行2次独立的发送,也不意味着另一方会将它们作为2次独立的接收来接收。
一种适用于字符串和二进制数据的简单解决方案是:首先发送消息中的字节数,然后发送消息。
以下是您应该对每条消息执行的操作,无论它是文件还是字符串:
发送方:
接收端:
- 从接收端执行一个循环,阻塞读取 4 个字节
- 然后对前面 4 个字节中指定的字符数执行块读取以获取数据。
除了我上面提到的 4 字节长度标头之外,您还可以添加一个恒定大小的命令类型标头(再次为整数),它描述了以下 recv.txt 中的内容。
您还可以考虑使用像 HTTP 这样的协议,它已经为您完成了很多工作,并且有很好的包装器库。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)