2015-06-03 76 views
0

首先,我將所請求的文件從服務器發送到客戶端,之後我想將文件的計算後的sha從服務器發送到客戶端,以便客戶端可以檢查發送和接收的文件都是相同的。從服務器到客戶端的多個發送python

我設法發送的文件,但是當我嘗試也派沙(這是一個可變的)我收到一個錯誤(我相信莎也被添加到該文件的內容)

我怎麼能將它們分開發送?

if (reqCommand == 'get'): 
    with open (reqFile, 'rb') as in_file, open(encFile, "wb") as out_file: 
     encrypt(in_file, out_file, "abc") 
     f = open(encFile,'rb') 
     for data in f: 
      # print 'here3' 
      conn.sendall(data) 
     f.close() 

     file_sh = hashfile(reqFile) 
     print 'the sha1 function from the server: ', file_sh 
     conn.send(file_sh) 

和客戶端:

while True: 
    data = sock.recv(1024) 

    if not data: 
     break 
    #print data 
    file_to_write.write(data) 

回答

1

你應該重新設計了一下你的應用程序是如何工作的:

  • 首先,服務器向客戶端發送的文件大小。
  • 客戶端讀取文件大小(將其轉換爲數字)並通知服務器(例如,向服務器發送「OK」)。
  • 服務器從客戶端讀取「OK」並開始發送文件內容(最好以較小的塊)。
  • 客戶端一直在讀取數據,直到其讀取完整的file size字節或發生錯誤。
  • 如果沒有發生錯誤,客戶端會計算剛收到的文件的散列並將其發送到服務器。
  • 服務器從客戶端讀取散列並與其本地文件進行比較;如果它們匹配,則發送「確定」給客戶端「錯誤」,否則。
  • 客戶端從服務器讀取響應:如果收到「ERROR」,則該文件被刪除。
+0

請問你能給我一個簡短的例子嗎?我仍然面臨問題 – spoke

+0

你到底在哪裏遇到問題?我不知道如何在評論中編寫代碼。 – CristiFati

+0

必須跑步,我可能會看看晚些時候或明天。 – CristiFati

0

TCP流需要在兩端進行格式化,因爲它是一個流而不是數據包。我想你可以找一個空字節('\x00'),它應該表示文件結束。

+0

二進制文件在其內容中通常具有'\ 0's。 – CristiFati

+0

我喜歡@ CristiFati的解答。發送文件的長度,讀取這個字節數,然後你就知道你已經完成了。 – Yurippenet

相關問題