Как написать эхо-сервер Python, который не отключается после первого эха? - PullRequest
0 голосов
/ 28 января 2019

Я хочу настроить простой эхо-сервер, который просто возвращает все, что клиент отправляет на него.Однако в настоящее время сервер отключается (сокет сервера закрывается) после того, как он возвращает первое клиентское сообщение.Я хочу иметь возможность непрерывно «общаться» с сервером, где сервер просто отображает несколько последовательных сообщений, которые я отправляю без отключения;Например:

«Привет!»

«Отголоски: Привет!»

«Как дела?»

«Отголоски: как дела?»

«Приветствия!»

«Отголоски: Приветствия!»

и т. Д.

В настоящее время у меня есть следующий код:

server.py:

import socket

HOST = '127.0.0.1' 
PORT = 5000

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.bind((HOST, PORT))
    s.listen()
    conn, addr = s.accept()
    with conn:
        while True:
            data = conn.recv(1024)
            if not data:
                break
            conn.sendall(data)

client.py:

import socket

HOST = '127.0.0.1'
PORT = 5000

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.connect((HOST, PORT))
    s.sendall(b'Hello, world')
    data = s.recv(1024)

print('Echoing: ', repr(data))

Сервер, однако,отключается после того, как оно возвращает первое клиентское сообщение (возможно, из-за оператора if not data: break).

PS Буду признателен за любые дополнительные объяснения, которые могут потребоваться - этот пример имеет образовательные цели, поэтому я не(только) после запуска кода.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 05 апреля 2019

Я покажу вам код, который я создал, затем расскажу вам через него:

Сервер:

import socket

HOST = '127.0.0.1' 
PORT = 5000

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.bind((HOST, PORT))
    s.listen()
    conn, addr = s.accept()
    with conn:
        while True:
            data = conn.recv(1024)
            conn.sendall(data)

Для сервера, который я удалил:

if not data:
   break

Это просто не сработало для меня.Если вы знаете, что ваше сообщение будет меньше 1024 байтов (что здесь), это не нужно.Но если вы хотите более длинное сообщение, измените это значение на большее.Так что да, вы были правы, подозревая, что это была та линия.

Клиент:

import socket

HOST = '127.0.0.1'
PORT = 5000

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.connect((HOST, PORT))
    print("Connected")
    while True:
        print("Sending data")
        s.sendall(b'Hello, world')
        print("Recieving data")
        data = s.recv(1024)
        print('Echoing: ', repr(data))

Для клиентской стороны я просто добавил процесс отправки и получения в цикл.

На заметку:

Это работает только для меня при запуске через терминал, я не знаю, знаете ли вы, как это сделать, так что извините, если высделайте, вот ссылка, объясняющая: https://www.wikihow.com/Use-Windows-Command-Prompt-to-Run-a-Python-File Я предполагал, что вы используете Windows.Вам нужно будет следовать процессу как для вашей программы client.py, так и для server.py.Сначала убедитесь, что вы запускаете программу server.py.

Это приведет к бесконечному циклу отправки и получения.Нажмите Ctrl + C, чтобы завершить.

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

0 голосов
/ 28 января 2019

Возможно, вместо сна используйте перерыв

if not data:
    time.sleep(1)
    continue

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

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