Программирование на Java с использованием сокетов – Пример сокет-сервера и клиента

Добро пожаловать в пример программирования на Java Socket. Каждый сервер – это программа, которая работает на конкретной системе и прослушивает определенный порт. Сокеты привязаны к номерам портов, и при запуске любого сервера он просто прослушивает сокет и ожидает запросов клиентов. Например, сервер Tomcat, работающий на порту 8080, ожидает запросов клиентов, и как только он получает любой запрос, отвечает на них.

Программирование на Java Socket

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

Пример сервера на Java Socket

package com.journaldev.socket;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.ClassNotFoundException;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * This class implements java Socket server
 * @author pankaj
 *
 */
public class SocketServerExample {
    
    //Статическая переменная ServerSocket
    private static ServerSocket server;
    //порт сокет-сервера, на котором он будет слушать
    private static int port = 9876;
    
    public static void main(String args[]) throws IOException, ClassNotFoundException{
        //создать объект сокет-сервера
        server = new ServerSocket(port);
        //продолжать прослушивание бесконечно, пока не получит вызов 'exit' или программа завершится
        while(true){
            System.out.println("Waiting for the client request");
            //создание сокета и ожидание подключения клиента
            Socket socket = server.accept();
            //чтение из сокета в объект ObjectInputStream
            ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
            //преобразование объекта ObjectInputStream в строку
            String message = (String) ois.readObject();
            System.out.println("Message Received: " + message);
            //создание объекта ObjectOutputStream
            ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
            //запись объекта в сокет
            oos.writeObject("Hi Client "+message);
            //закрытие ресурсов
            ois.close();
            oos.close();
            socket.close();
            //завершение сервера, если клиент отправляет запрос на выход
            if(message.equalsIgnoreCase("exit")) break;
        }
        System.out.println("Shutting down Socket server!!");
        //закрыть объект ServerSocket
        server.close();
    }
    
}

Java Socket Client

package com.journaldev.socket;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;

/**
 * This class implements java socket client
 * @author pankaj
 *
 */
public class SocketClientExample {

    public static void main(String[] args) throws UnknownHostException, IOException, ClassNotFoundException, InterruptedException{
        //получить IP-адрес локального хоста, если сервер работает на другом IP, нужно использовать его
        InetAddress host = InetAddress.getLocalHost();
        Socket socket = null;
        ObjectOutputStream oos = null;
        ObjectInputStream ois = null;
        for(int i=0; i<5;i++){
            //установить соединение с сервером через сокет
            socket = new Socket(host.getHostName(), 9876);
            //записать в сокет с использованием ObjectOutputStream
            oos = new ObjectOutputStream(socket.getOutputStream());
            System.out.println("Sending request to Socket Server");
            if(i==4)oos.writeObject("exit");
            else oos.writeObject(""+i);
            //прочитать сообщение от сервера
            ois = new ObjectInputStream(socket.getInputStream());
            String message = (String) ois.readObject();
            System.out.println("Message: " + message);
            //закрыть ресурсы
            ois.close();
            oos.close();
            Thread.sleep(100);
        }
    }
}

Для тестирования программирования сокетов на Java для обмена данными между сервером и клиентом сначала нам нужно запустить класс SocketServerExample. Когда вы запустите сервер сокетов, он просто напечатает “Ожидание запроса клиента”, а затем будет ожидать запроса клиента. Теперь, когда вы запустите класс SocketClientExample, он отправит запрос на сервер сокетов на Java и выведет ответное сообщение в консоль. Вот вывод программы сервера сокетов на Java SocketServerExample.

Waiting for the client request
Message Received: 0
Waiting for the client request
Message Received: 1
Waiting for the client request
Message Received: 2
Waiting for the client request
Message Received: 3
Waiting for the client request
Message Received: exit
Shutting down Socket server!!

Вот вывод программы клиента сокетов на Java SocketClientExample.

Sending request to Socket Server
Message: Hi Client 0
Sending request to Socket Server
Message: Hi Client 1
Sending request to Socket Server
Message: Hi Client 2
Sending request to Socket Server
Message: Hi Client 3
Sending request to Socket Server
Message: Hi Client exit

Это всё для быстрого обзора программирования сокетов на Java. Надеюсь, вы сможете начать работу с сервером сокетов на Java и программированием клиента на Java. Ссылка: Oracle Doc

Source:
https://www.digitalocean.com/community/tutorials/java-socket-programming-server-client