В какой момент застрял следующий код программирования на уровне сокета Python? - PullRequest
1 голос
/ 18 октября 2019

Это файл server.py, который запускает базовый сервер:

import socket
import sys

sockett = socket.socket()
sockett.bind(('127.0.0.1', 123))
sockett.listen(10)
while True:
    print('1', end='')
    while True:
        print('2', end='')
        try:
            client, addr = sockett.accept()
            print(client,addr)
            break
        except Exception as e:
            print(e)
    print(client.recv(400))
    print(client.recv(1024))
    print('3')
print('4')

А это код client.py, который я запускаю:

import socket
import sys

sockett = socket.socket()
sockett.connect(('127.0.0.1', 123))
sockett.send(b'0')
print("Hello")

Сомнение яесть то, что когда я запускаю файл server.py (пусть S), а затем файл client.py (пусть C), S продолжает работать, но C прекращает работу, что должно быть, но точка, в которой S застревает, являетсяГлавная проблема. Он печатает 3 в первый раз, а затем ничего не печатает, а не 4 (поэтому не из цикла), а не 1 (так что по-прежнему не зацикливается). В чем может быть причина? Где код после того, как он напечатал 3? Это вывод, который я получаю:

12<socket......>(...)
b'0'
b''
3
_ (keeps on running indefinitely)

По моему мнению, сначала он должен вывести 1, затем 2, а затем столкнуться с ошибкой, которая будет обработана try-исключения, и затем вывести:

b''
b''
3

, а затем продолжайте цикл, как это.

Ответы [ 2 ]

2 голосов
/ 18 октября 2019

Сервер фактически зацикливается, но причина, по которой вы не видите 1 или 2 при запуске этого сценария, заключается в том, что вы не сбрасываете вывод:

import socket
import sys

sockett = socket.socket()
sockett.bind(('127.0.0.1', 123))
sockett.listen(10)
while True:
    print('1', end='')
    while True:
        print('2', end='', flush=True)
        try:
            client, addr = sockett.accept()
            print(client,addr)
            break
        except Exception as e:
            print(e)
    print(client.recv(400))
    print(client.recv(1024))
    print('3')
print('4')

Вы будетеобратите внимание, что при flush=True в print('2', end='', flush=True) вы увидите 12, появившийся до подключения клиента, и еще раз после того, как клиент отключится.

12<socket...> (...)
b'0'
b''
3
12_ (keeps on running indefinitely)

Сэто, вы можете видеть, что он снова ждет в client, addr = sockett.accept()

0 голосов
/ 18 октября 2019
while True:
    print('1', end='')
    while True:
        print('2', end='')
        try:
            client, addr = sockett.accept()
            print(client,addr)
            break
        except Exception as e:
            print(e)

Эта часть будет выполнена успешно (и, как вы предполагаете, не попадет в ошибку), как только клиент подключится.

    print(client.recv(400))

Это будет читать b'0', отправленный клиентом.

    print(client.recv(1024))
    print('3')

Это будет ждать больше данных. Поскольку клиент закрывает соединение, он вернется с '', то есть без данных.

Затем он перейдет к началу цикла и оттуда во внутренний цикл, где он снова вызывает accept. accept будет блокироваться, пока не получит новое соединение. Поскольку вы не запускаете клиент снова, accept будет блокироваться навсегда.

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