... > Java > Сетевое программирование в...

Сетевое программирование в Java

НАВИГАЦИЯ ПО СТРАНИЦЕ

Создание сервера Создание клиента Запуск сервера и клиента Java NIO

Java предоставляет мощные средства для сетевого программирования с использованием пакетов java.net и java.nio. Давайте рассмотрим основы создания простого клиент-серверного приложения.

Шаг 1: Создание сервера

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

public class SimpleServer {
    public static void main(String[] args) {
        try (ServerSocket serverSocket = new ServerSocket(12345)) {
            System.out.println("Сервер запущен. Ожидание подключений...");

            while (true) {
                Socket clientSocket = serverSocket.accept();
                System.out.println("Подключен клиент: " + clientSocket.getInetAddress().getHostAddress());

                // Создание отдельного потока для обработки клиента
                Thread clientThread = new Thread(() -> handleClient(clientSocket));
                clientThread.start();
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private static void handleClient(Socket clientSocket) {
        try (Scanner scanner = new Scanner(clientSocket.getInputStream())) {
            while (scanner.hasNextLine()) {
                String message = scanner.nextLine();
                System.out.println("Сообщение от клиента: " + message);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Шаг 2: Создание клиента

import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;

public class SimpleClient {
    public static void main(String[] args) {
        try (Socket socket = new Socket("localhost", 12345);
             Scanner scanner = new Scanner(System.in);
             PrintWriter writer = new PrintWriter(socket.getOutputStream(), true)) {

            System.out.println("Подключено к серверу. Введите сообщение:");

            while (true) {
                String message = scanner.nextLine();
                writer.println(message);
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Шаг 3: Запуск сервера и клиента

  1. Запустите SimpleServer. Сервер начнет прослушивать подключения на порту 12345.

  2. Запустите несколько экземпляров SimpleClient. Они подключатся к серверу и вы сможете отправлять сообщения между клиентами.

Это простой пример, и в реальных приложениях следует учитывать асинхронные и многопоточные аспекты, чтобы обеспечить эффективную обработку множества клиентов.

Java NIO (New I/O)

Кроме классического подхода к сетевому программированию, Java также предоставляет API NIO, который позволяет более эффективно управлять множеством соединений. Пример использования Java NIO:

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class NIOServer {
    public static void main(String[] args) {
        ExecutorService executorService = Executors.newFixedThreadPool(10);

        try (ServerSocketChannel serverSocketChannel = ServerSocketChannel.open()) {
            serverSocketChannel.bind(new InetSocketAddress(12345));
            System.out.println("Сервер запущен. Ожидание подключений...");

            while (true) {
                SocketChannel clientChannel = serverSocketChannel.accept();
                System.out.println("Подключен клиент: " + clientChannel.getRemoteAddress());

                // Обработка каждого клиента в отдельном потоке
                executorService.submit(() -> handleClient(clientChannel));
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private static void handleClient(SocketChannel clientChannel) {
        try {
            ByteBuffer buffer = ByteBuffer.allocate(1024);

            while (clientChannel.read(buffer) > 0) {
                buffer.flip();
                System.out.print("Сообщение от клиента: ");
                while (buffer.hasRemaining()) {
                    System.out.print((char) buffer.get());
                }
                System.out.println();
                buffer.clear();
            }

            clientChannel.close();
            System.out.println("Клиент отключен.");

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

В этом примере используется ServerSocketChannel и SocketChannel из пакета java.nio.channels. В каждом потоке обработки клиента используется буфер ByteBuffer для эффективного чтения и записи.