Синхронная команда Wget, отправленная через сокет в Python - PullRequest
2 голосов
/ 03 декабря 2011

Я отправляю команды wget на удаленный сервер через сокеты.Вот код client :

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()

На server код выглядит следующим образом:

#!/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" отображается немедленно, пока сервер не завершил.

Какие изменения я должен сделать, чтобы "OK" отображалось после завершения загрузки каждого файла?Заранее большое спасибо за вашу помощь.

1 Ответ

2 голосов
/ 04 декабря 2011

У меня была похожая проблема только вчера. Вам нужен какой-нибудь способ, чтобы сервер сигнализировал "Я готов".

В клиентском коде он необходим для ожидания готовности сервера. В этом простом протоколе любой ответ означает «Я закончил». Вы можете сделать больше проверки ошибок, если вам это нужно.

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
...