Python – проблемы с сервером и клиентами

Я пытаюсь создать базовый серверный и клиентский скрипты. Идея состоит в том, что клиент может подключаться к серверу и выполнять команды. Своего рода SSH, но очень просто. Вот мой код сервера:

import sys, os, socket host = '' port = 50103 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.bind((host, port)) print("Server started on port: ", port) s.listen(1) while (1): conn, addr = s.accept() print 'New connection from ', addr try: while True: rc = conn.recv(2) pipe = os.popen(rc) rl = pipe.readlines() fl = conn.makefile('w', 0) fl.writelines(rl[:-1]) fl.close() except IOError: conn.close() 

И вот мой клиент:

  • Синхронизация потоков в Python
  •  import sys, socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) host = 'localhost' port = input('Port: ') s.connect((host, port)) while (1): cmd = raw_input('$ ') s.send(cmd) file = s.makefile('r', 0) sys.stdout.writelines(file.readlines()) file.close() 

    Вот моя проблема. Я запускаю сервер, а затем запускаю клиент на том же компьютере. Я вхожу в порт и подключаюсь. Затем я получаю raw_input, который является «$». Если я нахожу команду наподобие «ls», она просто зависает на стороне клиента. Мне нужно выйти из сервера для клиента, чтобы получить вывод ls. Кстати, я запускаю Ubuntu Linux. Не уверен, если это имеет значение.

  • Синхронизация потоков в Python
  • 2 Solutions collect form web for “Python – проблемы с сервером и клиентами”

    Когда вы создаете файл () в сокете, а затем используете readlines () на нем, он будет продолжаться до тех пор, пока вы не достигнете конца файла, который в случае сокета будет закрыт с другого конца.

    Использование makefile () в этом случае не имеет для меня никакого смысла, тем более что вы его создаете и закрываете после каждой команды. Просто используйте send () и recv () на обоих концах.

    Вероятно, вы также захотите иметь какой-то фактический «протокол», поэтому сервер сообщает клиенту «ЗДЕСЬ ПРИНЯТЬ РЕАГИРОВАНИЕ» и «ЭТО КОНЕЦ РЕАГИРОВАНИЯ», чтобы клиент знал. В противном случае становится трудно узнать, когда перестать ждать ответа. 🙂

    Обновите пример, который работает:

    server.py:

     import sys, os, socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.bind(('', 50500)) print("Server started") s.listen(1) while True: print "Accepting" conn, addr = s.accept() print 'New connection from ', addr while True: try: rc = conn.recv(1024) print "Command", rc if not rc.strip(): continue if rc.strip() == 'END': print "Close" conn.send("**END**") conn.close() break else: conn.send("This is the result of command %s\n" % rc) except Exception: conn.close() sys.exit() 

    client.py

     import sys, os, socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(('localhost', 50500)) while True: cmd = raw_input('$ ') s.send(cmd) result = s.recv(1024) print result if result == "**END**": print "Ending" break 

    Ну, с одной стороны, вы только подключаетесь к клиенту один раз, а на сервере вы закрываете сокет после каждого чтения.

    Вы должны взглянуть на этот пример.

    http://ilab.cs.byu.edu/python/socket/echoserver.html

    Вы делаете несколько вещей неправильно.

    Python - лучший язык программирования в мире.