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

«Что такое сокет (Socket) в контексте сетевого программирования?» — вопрос из категории Сети, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Сокет (Socket) — это конечная точка для двустороннего обмена данными между процессами по сети, абстрагирующая низкоуровневые детали сетевого взаимодействия. В Java для работы с TCP используются классы java.net.Socket (клиент) и java.net.ServerSocket (сервер).

Ключевые особенности:

  • Работает на транспортном уровне (TCP для надежных потоковых соединений или UDP для датаграмм).
  • Поддерживает блокирующий (стандартный) и неблокирующий (через NIO) режимы ввода-вывода.
  • Требует явного освобождения ресурсов методом close().

Пример TCP-сервера:

// Сервер ожидает подключений на порту 8080
ServerSocket serverSocket = new ServerSocket(8080);
Socket clientSocket = serverSocket.accept(); // Блокируется до подключения клиента

// Получение потока для чтения данных от клиента
InputStream in = clientSocket.getInputStream();
// ... чтение данных

serverSocket.close();

Пример TCP-клиента:

// Клиент подключается к серверу localhost на порт 8080
Socket socket = new Socket("localhost", 8080);

// Получение потока для отправки данных на сервер
OutputStream out = socket.getOutputStream();
// ... запись данных

socket.close();

Почему это важно: Сокеты — это фундаментальный низкоуровневый API для сетевого программирования. Для UDP используется класс DatagramSocket. В современных приложениях часто применяют высокоуровневые альтернативы (HTTP-клиенты, WebSockets, gRPC), которые внутри могут использовать сокеты.