2015-10-06 123 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

相關問題