все Python 3socketпонятие
socket.socket
создание сокетов
Класс сокета — конечной точки сетевого соединения: TCP (SOCK_STREAM) или UDP (SOCK_DGRAM), поверх IPv4 или IPv6.
Синтаксис
s = socket.socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None)
TCP — поток байтов, а не сообщений: один send может прийти несколькими recv, а два send — одним, поэтому читают в цикле до b'' (собеседник закрыл соединение) или до заранее известной длины. send() может отправить лишь часть и возвращает число байт — целое сообщение шлёт sendall(). Передаются только bytes: строку кодируют .encode(). settimeout(None) — снова блокирующий режим без срока, settimeout(0) — неблокирующий; закрывайте сокет через with. Модульная socket.dup — внутреннее имя; копию сокета даёт метод sock.dup().
Примеры
import socket
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
srv.bind(('127.0.0.1', 0)) # порт 0: свободный порт выберет система
srv.listen()
with socket.create_connection(srv.getsockname(), timeout=2) as cli:
conn, addr = srv.accept()
with conn:
cli.sendall(b'hello ')
cli.sendall(b'world')
cli.shutdown(socket.SHUT_WR)
chunks = []
while chunk := conn.recv(4):
chunks.append(chunk)
print(b''.join(chunks)) # → b'hello world'
print(len(chunks) > 1) # → True — сообщение пришло кусками
import socket
a, b = socket.socketpair()
with a, b:
try:
a.sendall('привет')
except TypeError as e:
print(e) # → a bytes-like object is required, not 'str'
a.sendall('привет'.encode('utf-8'))
print(b.recv(1024).decode('utf-8')) # → привет
См. также
Частые ошибки
Открыть в полном глоссарииdocs.python.orgСообщить о неточности