Без применения дополнительных библиотек, основа низкоуровневого сетевого взаимодействия в Java строится на двух классах:
Socket и
ServerSocket.
Socket – клиентское подключение. Отправляет запросы и получает ответы с заданного порта/адреса по TCP/IP-соединению. Наследники могут реализовывать протоколы более высокого уровня
сетевого стека, например
SSLSocket. Похож на утилиту
netcat из Unix-систем. Обслуживает
одно подключение к серверу, обменивается данными через
InputStream и
OutputStream.
ServerSocket – сервер, приёмник подключений. Занимает на машине заданный свободный порт, и в одиночку принимает
все подключения к нему. Опционально можно задать свой адрес, если текущая машина доступна по нескольким, а сокет должен быть доступен только по одному из них.
Ключевой метод серверного сокета –
accept(). Вызов этого метода
блокирует исполнение до тех пор, пока не придет новый запрос от клиента. Возвращает пришедший запрос в виде экземпляра класса
Socket. Чтобы сделать сервер параллельным,
accept() должен вызываться в параллельных потоках.
Стандартную внутреннюю реализацию сокетов можно подменить, установив для них статическую фабрику типа
SocketImplFactory, методом
setSocketFactory().
Для высокоуровневых (HTTP, FTP) запросов в стандартной библиотеке есть класс
URLConnection и его наследники.
Полный пример клиент-серверного приложения доступен в
туториале на сайте Oracle.