Ответ
Сокет (socket) — это абстрактный программный интерфейс, который служит конечной точкой для обмена данными между процессами. Эти процессы могут выполняться как на одной машине, так и на разных машинах в сети. Сокеты являются фундаментальным строительным блоком для большинства сетевых коммуникаций.
Почему сокеты важны? Сокеты предоставляют стандартизированный низкоуровневый механизм для создания сетевых соединений. Они позволяют программам отправлять и получать данные по сети, формируя основу для таких протоколов, как HTTP, FTP, SMTP и многих других. Понимание сокетов критично для разработки сетевых приложений.
В Python модуль socket предоставляет низкоуровневый API для работы с различными типами сетевых соединений (TCP/IP, UDP и др.).
Пример TCP-сервера и клиента на Python:
1. TCP-сервер (server.py):
import socket
HOST = '127.0.0.1' # Стандартный адрес loopback (localhost)
PORT = 65432 # Порт для прослушивания (непривилегированные порты > 1023)
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.bind((HOST, PORT))
s.listen() # Начинаем прослушивать входящие соединения
print(f"Сервер слушает на {HOST}:{PORT}")
conn, addr = s.accept() # Принимаем входящее соединение
with conn:
print(f"Подключено клиентом: {addr}")
while True:
data = conn.recv(1024) # Получаем данные от клиента
if not data: # Если данных нет, клиент отключился
break
print(f"Получено: {data.decode()}")
conn.sendall(b'Hello from server!') # Отправляем ответ клиенту
2. TCP-клиент (client.py):
import socket
HOST = '127.0.0.1' # Адрес сервера
PORT = 65432 # Порт сервера
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect((HOST, PORT)) # Подключаемся к серверу
s.sendall(b'Hello, server!') # Отправляем данные
data = s.recv(1024) # Получаем ответ
print(f"Получено от сервера: {data.decode()}") # Вывод: Получено от сервера: Hello from server!
Ключевые моменты:
- Типы сокетов:
socket.AF_INET: Семейство адресов IPv4.socket.SOCK_STREAM: Тип сокета для TCP (потоковый, надёжный, с установлением соединения).socket.SOCK_DGRAM: Тип сокета для UDP (дейтаграммный, без установления соединения, ненадёжный).
- Жизненный цикл: Серверные сокеты проходят этапы
bind(),listen(),accept(). Клиентские сокеты используютconnect(). - Закрытие соединений: Важно всегда закрывать сокеты (
close()) после использования, чтобы освободить системные ресурсы. Использованиеwithоператора в Python помогает автоматизировать это. - Низкоуровневый API: Модуль
socketпредоставляет прямой доступ к системным вызовам. Для большинства высокоуровневых задач (HTTP-запросы, WebSocket) предпочтительнее использовать специализированные библиотеки, такие какrequests,aiohttp,websockets, которые абстрагируют сложности работы с сокетами.