Python socket.accept () блокирует код перед вызовом? - PullRequest
0 голосов
/ 23 марта 2019

Я пытаюсь изучить Python-сокеты и попал в ловушку с помощью метода socket.accept (). Как я понимаю метод, когда я вызываю accept, поток будет сидеть и ждать входящего соединения (блокируя весь следующий код). Тем не менее, в коде ниже, который я получил от https://docs.python.org/2/library/socket.html и использую localhost. Я добавил печать ('привет') в первую строку сервера. Тем не менее, печать не появляется, пока я не отключу клиента. Почему это? Почему после того, как я связал сокет, кажется, что accept работает до моей печати?

# Echo server program
import socket

print('hello') # This doesn't print until I disconnect the client
HOST = 'localhost'              
PORT = 50007              
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(1)
conn, addr = s.accept()
print 'Connected by', addr
while 1:
    data = conn.recv(1024)
    if not data: break
    conn.sendall(data)
conn.close()
# Echo client program
import socket

HOST = 'localhost'    # The remote host
PORT = 50007              # The same port as used by the server
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
s.sendall('Hello, world')
data = s.recv(1024)
s.close()
print 'Received', repr(data)

1 Ответ

1 голос
/ 23 марта 2019

Вы, вероятно, используете устройство вывода в системе, которую ввод-вывод Python не распознает как интерактивную. В качестве обходного пути вы можете добавить sys.stdout.flush() после print.

Стандартный вывод - это буферизованный поток. Это означает, что при печати чего-либо вывод остается во внутреннем буфере до тех пор, пока вы не напечатаете достаточно данных, чтобы заполнить весь буфер (маловероятно, что в небольшой программе размер буфера составляет несколько килобайт). ) или до выхода из программы, когда все такие буферы автоматически очищаются. Обычно, когда выводом является терминальная служба, слой ввода-вывода автоматически переключается на буферизацию строки, где буфер также сбрасывается всякий раз, когда печатается символ новой строки (и который оператор print вставляет автоматически).

По какой-то причине это не работает в вашей системе, и вы должны явно сбросить. Другой вариант - запустить python -u, что должно вызвать небуферизованные стандартные потоки.

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