
Лаб_6 Головков И.Е. 12002108 КСМП
.docxФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ АВТОНОМНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ БЕЛОГОРОДСКИЙ ГОСУДАРСТВЕННЫЙ НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ УНИВЕРСИТЕТ (НИУ «БелГУ») ИНСТИТУТ ИНЖЕНЕРНЫХ И ЦИФРОВЫХ ТЕХНОЛОГИЙ
КАФЕДРА ИНФОРМАЦИОННЫХ И РОБОТОТЕХНИЧЕСКИХ СИСТЕМ
Отчет по лабораторной работе №6 Тема работы «Сетевые приложения «клиент-сервер» в Java» по дисциплине «Концепция создания модульных приложений»
студента очного отделения
2 курса группы 12002108
Головкова Игоря Евгеньевича
Проверил:
ст. пр. Гончаров Дмитрий Викторович
Белгород 2023
Цель работы: научиться создавать приложения клиента и сервера,
работающих по протоколам TCP и UDP.
Вариант 8
TCP: реализовать возможность обменяться всеми объектами с одним из подключенных клиентов.
UDP: команда перезагрузки (отключения, а затем повторного подключения) клиента.
Демонстрация работы приложения с TCP-соединением:
Рисунок 1 – Отправка сервером группы объектов двум клиетам
Рисунок 2 – Полученные вторым клиентом объекты
Демонстрация работы приложения с UDP-соединением:
Рисунок 3 – Сообщения, принятые получателем (сервером) от двух отправителей (клиентов)
Рисунок 4 – Работа второго отправителя с перезапуском и завершением работы
Листинг программы с TCP-соединением:
//Клиент
package com.tcp; import java.io.DataOutputStream; import java.io.EOFException; import java.io.ObjectInputStream; import java.net.Socket; import java.util.ArrayList; import java.util.List; public class Client { public static void main(String[] args) { String host = "localhost"; int port = 3333; boolean ready = true, writeCommands = true; List<ProductPack> productPackList = new ArrayList<>(); try { System.out.println("Клиент запущен"); Socket sock = new Socket(host, port); DataOutputStream dataOutputStream = new DataOutputStream(sock.getOutputStream()); dataOutputStream.writeBoolean(ready); dataOutputStream.writeBoolean(writeCommands); try (ObjectInputStream objectInputStream = new ObjectInputStream(sock.getInputStream())) { Object obj; while ((obj = objectInputStream.readObject()) != null) { ProductPack productPack = (ProductPack) obj; productPackList.add(productPack); } } catch (EOFException ignored) { } if (writeCommands) { for (ProductPack product : productPackList) { System.out.println(product); } } dataOutputStream.close(); sock.close(); } catch (Exception e) { e.printStackTrace(); } } }
//Сервер
package com.tcp; import java.io.DataInputStream; import java.io.ObjectOutputStream; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; import java.util.List; public class Server { public static void main(String[] args) { try { System.out.println("Сервер запущен"); int port = 3333; try (ServerSocket ss = new ServerSocket(port)) { while (true) { Socket s = ss.accept(); ServerConnectionProcessor p = new ServerConnectionProcessor(s); p.start(); } } } catch (Exception e) { e.printStackTrace(); } } } class ServerConnectionProcessor extends Thread { private Socket sock; public ServerConnectionProcessor(Socket s) { sock = s; } public void run() { try { // Получаем запрос boolean ready, writeCommands; DataInputStream dataInputStream = new DataInputStream(sock.getInputStream()); ready = dataInputStream.readBoolean(); writeCommands = dataInputStream.readBoolean(); if (ready) { // Создаем объекты List<ProductPack> productPackList = new ArrayList<>(); for (int i = 0; i < 10; i++) { productPackList.add(new ProductPack()); } if (writeCommands) { for (ProductPack product : productPackList) { System.out.println(product); } } // Передаём объекты ObjectOutputStream objectOutputStream = new ObjectOutputStream(sock.getOutputStream()); for (ProductPack product : productPackList) { objectOutputStream.writeObject(product); } dataInputStream.close(); objectOutputStream.close(); sock.close(); } } catch (Exception e) { e.printStackTrace(); } } }
package com.tcp; import java.io.Serializable; import java.time.LocalDateTime; public class ProductPack implements Serializable { int amount; LocalDateTime timeOfCreation; @Override public String toString() { return "УпаковкаТоваров{" + "Количество=" + amount + ", ВремяИзготовления=" + timeOfCreation + '}'; } public ProductPack() { amount = (int) (Math.random() * 10) + 1; timeOfCreation = LocalDateTime.now(); } }
Листинг программы с 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")) { 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) { 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("Receiver is running"); 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())); } } catch(Exception e) { e.printStackTrace(); } } }