Python сокет-клиент работает только на одну итерацию - PullRequest
0 голосов
/ 03 апреля 2020

Я пытаюсь реализовать сокеты с python. Следующий код работает хорошо без времени l oop .. но с временем l oop для второй итерации он застревает в s.sendall ( Не могли бы вы подсказать, как это исправить? </p> <pre><code>def main(): host = socket.gethostname() port = 11111 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect((host, port)) print "Connected to Server!" while True: print "Enter your Command:" command = raw_input() if(command): try: sock.sendall(repr(command)) except socket.error: print "Socket Error Occured" data = sock.recv(1024) if data: print('Received', repr(data)) else: print "No Data" else: os.system("clear") sock.close() if __name__ == "__main__": main()

1 Ответ

0 голосов
/ 04 апреля 2020

Здравствуйте

У меня нет всей информации, которая мне нужна, чтобы сделать этот пост настолько информированным, насколько мне хотелось бы, однако я могу высказать некоторые догадки и постараться изо всех сил объяснить, что я думаю пошло не так. Вы готовы?? Давайте займемся этим.

Итак,

Вы начинаете с создания tcp socket и затем подключаетесь к серверу, расположенному локально на порту 11111

    host = socket.gethostname()
    port = 11111                 
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.connect((host, port))

затем вы вводите al oop

    while True:
        #input command, request  eval

Здесь ваша цель - взять пользовательский ввод и отправить его на сервер на eval. Вы делаете это с

        #get user input
        print "Enter your Command:"
        command = raw_input()

        #send command to server for eval
        sock.sendall(repr(command))

        #receive then print eval
        data = sock.recv(1024)
        print('Received', repr(data))

, это работает и отправляет команды так, как вы ожидаете, хотя отправка repr(command) может быть не тем, что вы хотите отправить

command = "1+1"
eval(command) 
//2
eval(repr(command))
//'1+1'

Сейчас

Вот где я должен сделать некоторые предположения

Раньше вы connected на сервер

    sock.connect((host, port))

Я предполагаю, что сервер accepts ваше соединение evals ваше command и отправляет ответ обратно. Что-то вроде

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind('localhost',11111)
sock.listen()

while True:
    conn, addr = sock.accept()
    command = conn.recv(1024)
    sock.sendall(eval(command))

Если это так, то ваше соединение может не работать, потому что ваш eval сервер запускает eval один раз, а затем accepts новое соединение. Это означает, что ваш клиент больше не может отправлять или получать данные с сервера

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...