2011-12-03 66 views
2

我正在通過套接字發送wget命令到遠程服務器。 這裏是客戶代碼:在Python中通過套接字發送的同步wget命令

import socket 
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.connect(('192.168.1.16',12345)) 
s.send('wget http://url/file1') 
print "file 1 OK" 
s.send('wget http://url/file2') 
print "file 2 OK" 
s.send('wget http://url/file3') 
print "file 3 OK" 
s.close() 

服務器,代碼如下:

#!/usr/bin/env python 
import socket 
import subprocess 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.bind(('', 12345)) 
s.listen(1) 
conn, addr = s.accept() 
while True: 
    data = conn.recv(1024) 
    cmd = ['/bin/sh', '-c', data] 
    proc = subprocess.Popen(cmd, stdout=subprocess.PIPE).wait() 

我有2個問題:發送到服務器

  1. 說明被分組。服務器沒有完成3個指令,而是隻接收1個連接3個指令的文件
  2. 「文件n正常」在服務器未完成時立即顯示。

我應該做些什麼修改以確保在每個文件的下載完成後顯示「OK」? 非常感謝您的幫助。

+0

爲什麼wget的,而不是純Python? – akira

回答

2

我昨天有個similar problem。您需要某種方式讓服務器發出「我已完成」的信號。

在客戶端代碼中,您需要它等待服務器準備就緒。在這個簡單的協議中,任何迴應都意味着「我完成了」。如果你需要它,你可以做更多的錯誤檢查。

s.send('wget http://url/file1') 
print "file 1 OK" 
s.recv(1024) # Wait for ANY response 
s.send(.... 

而且服務器代碼...

while True: 
    data = conn.recv(1024) 
    cmd = ['/bin/sh', '-c', data] 
    proc = subprocess.Popen(cmd, stdout=subprocess.PIPE).wait() 
    conn.send('done') # Send something, ANYTHING 
# EOF 
+0

非常感謝FakeRainBrigand,它非常完美。現在它可以工作。 –