У меня проблемы с пониманием кода для сокет программирования в Python - PullRequest
0 голосов
/ 30 июня 2019

Я новичок в области сокетов и в последнее время пытаюсь создать приложение для терминального чата с этим. У меня все еще проблемы с пониманием блокировок и выбора функций

"Это код, который я взял с веб-сайта, с которого я читаю, и в коде, если в данных ничего нет, как это означает, что сокет был отключен, и, пожалуйста, также объясните, что влияет на блокировку набора в сервер или клиент. Я где-то читал, что блокировка набора позволяет перейти, если данные не были полностью получены, я не совсем удовлетворен объяснением. Пожалуйста, объясните простыми словами "

import select
import socket
import sys
import Queue

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.setblocking(0)
server_address = ('localhost', 10000)
server.bind(server_address)
server.listen(5)
inputs = [ server ]

outputs = [ ]
message_queues = {}

while inputs:

 readable, writable, exceptional = select.select(inputs, outputs, inputs)

for s in readable:

 if s is server:

connection, client_address = s.accept()

connection.setblocking(0)
            inputs.append(connection)

 message_queues[connection] = Queue.Queue()

 else:
            data = s.recv(1024)
            if data:
                message_queues[s].put(data)
                if s not in outputs:
                    outputs.append(s)
            else:
                if s in outputs:
                    outputs.remove(s)
                inputs.remove(s)
                s.close()

1 Ответ

0 голосов
/ 01 июля 2019

если в данных ничего нет, как это означает, что сокет был отключен

Спецификация POSIX recv () гласит:

После успешного завершения recv () возвращает длину сообщения в байтах.Если нет доступных сообщений для приема, и одноранговый узел выполнил упорядоченное завершение, recv () должен вернуть 0. ...

В интерфейсе Python возвращаемое значение 0 соответствует возвращенному буферудлины 0, т. е. ничего в data.

, что влияет на блокировку установки на сервере или клиенте.

setblocking(0) устанавливает сокет как неблокирующий, т. е. если, например, accept() или recv() не может быть завершен немедленно, операция завершается ошибкой, а не блокируется до завершения.В данном коде это вряд ли может произойти, поскольку операции не выполняются до того, как они станут возможными (из-за использования select()).Однако пример плохой, поскольку он включает output в аргументы select(), что приводит к циклу занятости, поскольку output доступна для записи в большинстве случаев.

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