Python Glossary English

все 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Сообщить о неточности