在字符串发送通过TCP服务器上的文件
问题描述:
我们需要发送一个PDF文件通过TCP服务器字符串格式如下:在字符串发送通过TCP服务器上的文件
命令数日期大小文件
在服务器中,我们正在做的:
l = f.read()
f.close()
user.sendall(("AQT " + "12345678 " + "16SET2015_12:00:00 " + str(size) + " " + l).encode('utf-8')
我们的客户是这样的:
quiz = s.recv(buff_size)
quiz_aux = quiz
while(quiz_aux):
quiz_aux = s.recv(buff_size)
quiz += quiz_aux
quiz = quiz.decode('utf-8')
response = quiz.split(" ", 4)
if response[0] == 'AQT':
QID = eval(response[1])
time = response[2]
size = eval(response[3])
file_name = topic + "QF" + "001" + ".pdf"
f = open(file_name, "w")
f.write(response[4])
f.close()
print("received file " + file_name)
我们似乎无法得到正确的编码,不管我们尝试它不工作,它也似乎不接收整个文件。
如果有人能够帮助我们,我们会非常感激。
答
你很可能以ASCII码而不是BINARY模式打开你的文件。这就是为什么你没有收到完整的文件,因为你从来没有读过完整的文件。
with open(file,'rb') as f:
data = f.read() # reads the complete file.
我这里还有一些缺陷在代码:
- (“UTF-8”)魔法,你很可能会想转让不需要解码的数据字节逐字节。
- 致电
eval
做解析int
不安全,请改用int()
。 - 在变量中存储大文件或将大文件传递给单个
send/sendall
调用的效率非常低。接收大量数据也是如此。 - 协议设计有缺陷。确保你的同行很早就知道消息的大小。
这是你的代码的工作示例:
客户端:
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import socket
import os
TCP_IP = '127.0.0.1'
TCP_PORT = 9999
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((TCP_IP, TCP_PORT))
with open(bigfile,'rb') as f:
f.seek(0, os.SEEK_END)
size = f.tell()
f.seek(0, os.SEEK_SET)
x = f.read()
s.sendall("AQT " + "12345678 " + "16SET2015_12:00:00 " + str(size) + " " + x)
s.close()
服务器:
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import socket
TCP_IP = '127.0.0.1'
TCP_PORT = 9999
buff_size = 1024*8
topic = "xyz"
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((TCP_IP, TCP_PORT))
s.listen(1)
print "ready"
conn, addr = s.accept()
print 'Connection address:', addr
quiz = conn.recv(buff_size)
quiz_aux = quiz
while(quiz_aux):
quiz_aux = conn.recv(buff_size)
quiz += quiz_aux
response = quiz.split(" ", 4)
print len(response)
if response[0] == 'AQT':
QID = int(response[1])
time = response[2]
size = int(response[3])
file_name = topic + "QF" + "001" + ".txt"
f = open(file_name, "wb")
f.write(response[4])
f.close()
print("received file " + file_name)
conn.close()
有多大的文件? 'buff_size'有多大? – cg909
@ cg909现在我们正在测试60kb或更少的文件。将来,我们将会传输大约1/2mb的文件。 buff_size是1024 – Hel