Если вы хотите, чтобы ваш клиент повторил то, что он делает, просто добавьте туда цикл;)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = 'localhost'
port = input('Port: ')
s.connect((host, port))
while True:
cmd = raw_input('$ ')
s.send(cmd)
file = s.makefile('r', 0)
sys.stdout.writelines(file.readlines())
Должно быть, вероятно, ближе к тому, что вы хотите.
Другие комментарии:
s.listen(1)
Этот оператор, вероятно, следует переместить за пределы цикла while.Вам нужно всего лишь один раз вызвать listen
.
pipe = os.popen(rc)
os.popen устарел, вместо этого используйте модуль подпроцесса .
file = s.makefile('r', 0)
Выоткрыв файл, но вы никогда не закроете файл.Вам, вероятно, следует добавить file.close()
после вашего sys.stdout.writelines()
вызова.
РЕДАКТИРОВАТЬ: , чтобы ответить ниже комментарий;сделано здесь из-за длины и форматирования
В таком виде вы читаете из сокета один раз, а затем сразу же закрываете его.Таким образом, когда клиент отправляет следующую команду, он видит, что сервер закрыл сокет, и выдает ошибку.
Решение состоит в том, чтобы изменить код сервера, чтобы он мог обрабатывать прием нескольких команд.Обратите внимание, что это решается введением другого цикла.
Вам нужно обернуть
rc = conn.recv(2)
pipe = os.popen(rc)
rl = pipe.readlines()
fl = conn.makefile('w', 0)
fl.writelines(rl[:-1])
в другой цикл while True:
, чтобы он повторялся до тех пор, пока клиент не отключится, а затем обернуть егоблок try-Кроме того, что ловит IOError, который выдается conn.recv (), когда клиент отключается.
блок try-Кроме должен выглядеть как
try:
# the described above loop goes here
except IOError:
conn.close()
# execution continues on...