TCP-сокеты Python: могут ли клиентские и серверные сокеты работать в одном потоке?

#python #multithreading #sockets #tcp

#python #многопоточность #сокеты #tcp

Вопрос:

Насколько я знаю, клиентский и серверный скрипт для подключения к сокетам не могут быть запущены в одной программе (потоке). Но приведенный ниже пример позволяет устанавливать соединение между сокетами и даже обмениваться сообщениями между ними в одной программе (потоке).

Кто-нибудь может объяснить, что здесь не так?

 from socket import socket, AF_INET, SOCK_STREAM, SOL_SOCKET, SO_REUSEADDR
import time

SERV_SOCK = socket(AF_INET, SOCK_STREAM)
SERV_SOCK.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
SERV_SOCK.bind(('localhost', 8888))
SERV_SOCK.listen()

CLIENT_SOCK = socket(AF_INET, SOCK_STREAM)
CLIENT_SOCK.connect(('localhost', 8888))

CLIENT_SOCK_SERV, ADDR = SERV_SOCK.accept()

TIMESTR = time.ctime(time.time())   "n"
CLIENT_SOCK_SERV.send(TIMESTR.encode('utf-8'))
TIME_BYTES = CLIENT_SOCK.recv(1024)
print(f"Current time: {TIME_BYTES.decode('utf-8')}")

time.sleep(1)
TIMESTR = time.ctime(time.time())   "n"
CLIENT_SOCK.send(TIMESTR.encode('utf-8'))
TIME_BYTES = CLIENT_SOCK_SERV.recv(1024)
print(f"Current time: {TIME_BYTES.decode('utf-8')}")
 

Ответ №1:

Ни в коем случае этот код не считается «блокирующим», так почему бы ему не работать?

Хотя серверные и клиентские сокеты программируются на python, используемая библиотека сокетов выполняет вызовы базовой системы через доступные в системах API.

Интерфейс Python представляет собой простую транслитерацию системного вызова Unix и интерфейса библиотеки для сокетов в объектно-ориентированный стиль Python: функция socket() возвращает объект сокета, методы которого реализуют различные системные вызовы сокетов. Типы параметров несколько более высокого уровня, чем в интерфейсе C: как и в случае операций чтения () и записи () над файлами Python, выделение буфера при операциях приема происходит автоматически, а длина буфера неявно определяется при операциях отправки.

Я бы настоятельно рекомендовал прочитать инструкции по сокетам python и ссылки на библиотеки сокетов python, поскольку они охватывают блокировку как одно из 3 состояний сокета (блокирование, неблокирование и тайм-аут)