2011-12-03 36 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,它非常完美。现在它可以工作。 –