2015-10-06 117 views
0

我们需要发送一个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) 

我们似乎无法得到正确的编码,不管我们尝试它不工作,它也似乎不接收整个文件。

如果有人能够帮助我们,我们会非常感激。

+0

有多大的文件? 'buff_size'有多大? – cg909

+0

@ cg909现在我们正在测试60kb或更少的文件。将来,我们将会传输大约1/2mb的文件。 buff_size是1024 – Hel

回答

0

你很可能以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() 
+0

谢谢你的回答。我们的问题是,我们不能使这个工作的PDF文件,但它适用于TXT。 – Hel

+0

此代码执行二进制传输,因此适用于纯ASCII或二进制数据。我已经用45MBytes的mp3对它进行了测试,两款sha-256 chksums都匹配,没有损坏。请确保以二进制模式读取和写入(请参阅'open(file,'rb')'),然后使用此代码片段重新运行测试。 – tintin

相关问题