#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 состояний сокета (блокирование, неблокирование и тайм-аут)