我有一个用C编写的服务器,我想在python中编写一个客户端.当python客户端想要发送文件,然后是文件的内容和字符串"end some_file"时,它将发送一个字符串"send 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")
问题是这样的:
服务器从recv接收"send some_file"字符串
在第二个recv中,文件的内容和"结束文件"字符串一起发送
在服务器代码中,缓冲区的大小是4096.我在尝试发送小于4096k的文件时首先注意到这个错误.如何确保服务器独立接收字符串?
使用套接字编程,即使您执行2次独立发送,也不意味着另一方将接收它们作为2个独立的recv.
一个适用于字符串和二进制数据的简单解决方案是:首先发送消息中的字节数,然后发送消息.
以下是每条消息应该做的事情,无论是文件还是字符串:
发件人方:
发送4个字节,保存以下发送中的字节数
发送实际数据
接收方:
从接收器端执行一个循环,阻止读取4个字节
然后在读取上执行一个块,以获取前4个字节中指定的字符数以获取数据.
除了我上面提到的4字节长度标头之外,您还可以添加一个常量大小的命令类型标头(再次整数),它描述了以下recv中的内容.
你也可以考虑使用像HTTP这样的协议,它已经为你做了很多工作,并且有很好的包装库.