Что такое сокет (socket) в программировании?

Ответ

Сокет (Socket) — это конечная точка для двустороннего обмена данными между процессами по сети. Он связывает IP-адрес хоста и номер порта, позволяя программам общаться по протоколам TCP или UDP.

Основные типы сокетов:

  1. Потоковые сокеты (SOCK_STREAM): Используют протокол TCP. Гарантируют надежную, упорядоченную доставку данных с предварительным установлением соединения.
  2. Дейтаграммные сокеты (SOCK_DGRAM): Используют протокол UDP. Отправляют данные без установки соединения, быстрее, но без гарантий доставки и порядка.

Простой пример TCP-клиента и сервера на Python:

server.py (Сервер)

import socket

# Создание TCP/IP сокета
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# Привязка сокета к адресу и порту
server_socket.bind(('127.0.0.1', 65432))
# Начало прослушивания входящих соединений
server_socket.listen()
print("Сервер запущен и ожидает подключений...")

# Принятие соединения
connection, client_address = server_socket.accept()
with connection:
    print(f'Подключен клиент: {client_address}')
    # Получение данных от клиента
    data = connection.recv(1024)
    print(f'Получено: {data.decode()}')
    # Отправка ответа
    connection.sendall(b'Hello from server!')

client.py (Клиент)

import socket

# Создание сокета и подключение к серверу
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as client_socket:
    client_socket.connect(('127.0.0.1', 65432))
    # Отправка данных
    client_socket.sendall(b'Hello from client!')
    # Получение ответа
    data = client_socket.recv(1024)
print(f'Получен ответ: {data.decode()}')

Применение: онлайн-чаты, многопользовательские игры, стриминг, API реального времени.

Ответ 18+ 🔞

Вот, слушай, объясняю на пальцах, как эти ваши сокеты работают, а то у тебя, я смотрю, в глазах уже туман. Сокет — это, грубо говоря, такая ебушки-воробушки дырочка в компе, куда можно вставлять и вынимать данные по сети. Представь себе розетку, только для информации. С одной стороны IP-адрес (это типа адрес дома), с другой — порт (это номер квартиры в этом доме). Связал их — и пошла писать губерния, программы болтают между собой.

Их, этих сокетов, два главных типа, как два брата, но один — ответственный зануда, а второй — похуист-распиздяй.

  1. Потоковые (SOCK_STREAM). Это тот самый зануда, который использует TCP. Он, сука, прежде чем слово сказать, трижды руку пожмёт: «Здравствуйте, установим соединение?». Гарантирует, что все билетики дойдут в целости, сохранности и ровно в той последовательности, в которой ты их отправил. Надёжный, блядь, как швейцарские часы, но и тормозной иногда.
  2. Дейтаграммные (SOCK_DGRAM). А это наш похуист, работает по UDP. Его девиз: «Отправил и забыл, ебать». Никаких рукопожатий, никаких гарантий. Швырнул пакет данных в общую толпу и молись, чтобы он долетел. Быстрый, как угорелый, но может и потеряться по дороге, и прийти в другом порядке. Хуй с горы, короче.

А теперь, чтобы не быть голословным, смотри, как это выглядит в коде на Python. Тот самый пример с занудой-сервером и клиентом, который к нему стучится.

server.py (Сервер, который ждёт у моря погоды)

import socket

# Рождаем сокет. AF_INET — это для IPv4, SOCK_STREAM — для нашего зануды TCP.
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# Прописываем ему прописку: адрес localhost и порт 65432.
server_socket.bind(('127.0.0.1', 65432))
# Садимся у окна и начинаем слушать: "А не идёт ли кто к нам в гости?"
server_socket.listen()
print("Сервер запущен и ожидает подключений...")

# А вот и гость! accept() — это когда ты, наконец, открываешь дверь.
connection, client_address = server_socket.accept()
with connection:
    print(f'Подключен клиент: {client_address}')
    # Гость что-то бормочет. Слушаем.
    data = connection.recv(1024)
    print(f'Получено: {data.decode()}')
    # Вежливо отвечаем.
    connection.sendall(b'Hello from server!')

client.py (Клиент, который пришёл в гости)

import socket

# Тоже рождаем сокет и сразу идём в гости по известному адресу.
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as client_socket:
    client_socket.connect(('127.0.0.1', 65432))
    # С порога заявляем.
    client_socket.sendall(b'Hello from client!')
    # Ждём, что нам ответят.
    data = client_socket.recv(1024)
print(f'Получен ответ: {data.decode()}')

А где это, блядь, применяется? Да везде, где программы друг с другом общаются! Онлайн-чаты, где ты трёшь свою дичь, многопользовательские игры, где все друг друга мочат, стриминг видео, когда ты смотришь, как кто-то проходится по ебалу боссу, или всякие API, которые в реальном времени данные шлют. В общем, везде, где нужна связь, кроме, разве что, разговоров с самим собой — для этого сокеты не нужны, хотя, погоди...