Сетевое программирование в Java
НАВИГАЦИЯ ПО СТРАНИЦЕ
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: Запуск сервера и клиента
Запустите SimpleServer. Сервер начнет прослушивать подключения на порту 12345.
Запустите несколько экземпляров 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 для эффективного чтения и записи.