
Лаб 6
.docxTCP
Рисунок 1 – Получение и отправка значений сервером
Рисунок 2 – Оправка и проверка значений первым клиентом
Рисунок 3 – Получение значений вторым клиентом
Листинг кода сервера:
package com.tcp; import java.io.*; import java.net.ServerSocket; import java.net.Socket; public class Server { public static void main(String[] args) { try { System.out.println("Сервер запущен"); try (ServerSocket ss = new ServerSocket(3333)) { while (true) { Socket s = ss.accept(); ServerConnectionProcessor p = new ServerConnectionProcessor(s); p.start(); } } } catch (Exception e) { e.printStackTrace(); } } } class ServerConnectionProcessor extends Thread { private Socket socket; private static double freqF = 0; private static double freqU = 0; public ServerConnectionProcessor(Socket s) { socket = s; } public void run() { try { System.out.println("Новый клиент подключился: " + socket); // Создать потоки ввода и вывода для обмена данными с клиентом BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); PrintWriter out = new PrintWriter(socket.getOutputStream(), true); // Создать поток для чтения сообщений с консоли BufferedReader consoleIn = new BufferedReader(new InputStreamReader(System.in)); // Запустить поток для чтения сообщений от клиента и отправки ответов while (true) { // Прочитать сообщение от клиента String message = in.readLine(); // Если сообщение "exit", то завершить работу if (message == null || message.equals("exit")) break; else if (message.matches("\\d+\\.\\d+\\s\\d+\\.\\d+")) { freqF = Double.parseDouble(message.split(" ")[0]); freqU = Double.parseDouble(message.split(" ")[1]); out.println("Значения установлены"); System.out.println("Установлены новые значения: " + freqF + " " + freqU); } else { System.out.println("Клиенту " + socket + " переданы значения " + freqF + " " + freqU); out.println(freqF + " " + freqU); } } } catch (IOException e) { System.err.println("Ошибка при чтении сообщения от клиента: " + e.getMessage()); } finally { try { socket.close(); System.out.println("Клиент отключился: " + socket); } catch (IOException e) { System.err.println("Ошибка при закрытии сокета: " + e.getMessage()); } } } }
Листинг кода клиента: package com.tcp; import java.io.*; import java.net.Socket; public class ClientOne { private static double freqF = -1; private static double freqU = -1; public static void main(String[] args) { System.out.println("Клиент запущен"); try (Socket socket = new Socket("localhost", 3333)) { System.out.println("Клиент подключен к серверу: " + socket); // Создать потоки ввода и вывода для обмена данными с сервером BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); PrintWriter out = new PrintWriter(socket.getOutputStream(), true); // Создать поток для чтения сообщений с консоли BufferedReader consoleIn = new BufferedReader(new InputStreamReader(System.in)); // Цикл обмена сообщениями while (true) { // Отправить сообщение на сервер System.out.print("Введите сообщение: "); String message = consoleIn.readLine(); out.println(message); // Если сообщение "exit", то завершить работу if (message.equals("exit")) break; // Прочитать ответ от сервера String response = in.readLine(); System.out.println("Сервер ответил: " + response); if (response.matches("\\d+\\.\\d+\\s\\d+\\.\\d+")) { freqF = Double.parseDouble(response.split(" ")[0]); freqU = Double.parseDouble(response.split(" ")[1]); System.out.println("Установлены новые значения: " + freqF + " " + freqU); } } } catch (Exception e) { e.printStackTrace(); } System.out.println("Клиент отключен"); } }
UDP
Рисунок 4 – Отправка сообщений по UDP, перезагрузка отправителя
Рисунок 4 – Получение сообщений по UDP
Листинг кода отправителя:
package com.udp; //sender import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.util.Scanner; public class Sender { public Sender() { } public void sendMessage(String message) { try { byte[] data = message.getBytes(); InetAddress addr = InetAddress.getByName("localhost"); DatagramPacket pack = new DatagramPacket(data, data.length, addr, 4444); DatagramSocket datagramSocket = new DatagramSocket(); if (message.equals("00")) { System.out.println("Отправитель перезапущен"); datagramSocket.close(); return; } else if (message.equals("000")) { datagramSocket.close(); System.exit(0); } datagramSocket.send(pack); datagramSocket.close(); } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { System.out.println("Отправитель запущен"); System.out.println("Стандартный режим: передача текстового сообщения"); System.out.println("Введите 00, чтобы переподключить отправитель"); System.out.println("Введите 000, чтобы завершить работу"); Sender sender = new Sender(); while (true) { System.out.println("Введите сообщение для отправки: "); sender.sendMessage(new Scanner(System.in).nextLine()); } } }
Листинг кода получателя:
package com.udp; import java.net.DatagramPacket; import java.net.DatagramSocket; public class Receiver { public static void main(String[] args) { System.out.println("Получатель запущен"); try{ DatagramSocket ds = new DatagramSocket(4444); while (true){ DatagramPacket pack = new DatagramPacket(new byte[64],64); ds.receive(pack); System.out.println("Получено сообщение: " + new String(pack.getData()).trim()); } } catch(Exception e) { e.printStackTrace(); } } }