2015-10-27 163 views
0

這大部分已經被回答了here 我一直試圖在收到整個文件時修改服務器(發送)和客戶端(接收)來自服務器的反饋。發送和接收python套接字中的文件

下面是客戶端服務器代碼;因爲它目前都是客戶端和服務器掛起的。即。無情地進入「忙碌」狀態(客戶端和服務器都不做任何事情,直到服務器上的ctrl-c報告失敗爲止「l = sc.recv(1024)」,並且客戶端上的ctrl-c報告失敗「reply = s。的recv(1024)「)

import socket 
import sys 
s = socket.socket() 
s.bind(("localhost",3000)) 
s.listen(10) 
i=1 
while True: 
    sc, address = s.accept() 
    print address 
    f = open('tranmit.jpg",'wb') #open in binary 
    l = 1 
    while(l): 
     l = sc.recv(1024) 
     while (l): 
      f.write(l) 
      l = sc.recv(1024) 
     f.close() 
     sc.send("received") # Would like to send back a response 

    sc.close() 

s.close() 
------------------------------------------------------------ 
#client 
s = socket.socket() 
s.connect(("localhost",3000)) 
f=open ("tranmit.jpg", "rb") 
l = f.read(1024) 
while (l): 
    s.send(l) 
    l = f.read(1024) 
reply =s.recv(1024) # Feedback: would like the receive feedback from the server. 
print reply 
s.close() 

的代碼工作正常,而不在上面的鏈接)中(添加反饋線,沒有任何人有關於如何保持這與反饋工作,以及一個想法? 謝謝。

回答

0

您的客戶必須以某種方式指示整個文件已發送。就目前而言,您的服務器無法知道客戶端的發送操作何時完成。

一種解決方案是在所有傳輸完成後調用socket.shutdown。這是您的客戶端程序的新版本。您的服務器程序不需要更換器。

#client 
import socket 
s = socket.socket() 
s.connect(("localhost",3000)) 
f=open ("tranmit.jpg", "rb") 
l = f.read(1024) 
while (l): 
    s.send(l) 
    l = f.read(1024) 
s.shutdown(socket.SHUT_WR) 
reply =s.recv(1024) # Feedback: would like the receive feedback from the server. 
print reply 
s.close() 
+0

我想我可能會再次尋求類似這樣你的幫助的東西,所以它正常工作與像來自服務器的響應串/文本,但「回覆= s.recv(1024)」的客戶端代碼似乎無限期掛起當你在服務器端引入一個函數調用時,特別是如果函數花費60多秒來運行......任何想法?服務器完成運行函數調用並返回結果,而這個結果永遠不會到達客戶端進程。在此先感謝 – Ezra

+0

這聽起來像是一個全新的問題。遵循[ask]和[mcve]中的指導原則,請在Stack Overflow上發佈一個新問題。 –

相關問題