Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лаб_6 Головков И.Е. 12002108 КСМП

.docx
Скачиваний:
1
Добавлен:
26.06.2024
Размер:
265.56 Кб
Скачать

ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ АВТОНОМНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ БЕЛОГОРОДСКИЙ ГОСУДАРСТВЕННЫЙ НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ УНИВЕРСИТЕТ (НИУ «БелГУ») ИНСТИТУТ ИНЖЕНЕРНЫХ И ЦИФРОВЫХ ТЕХНОЛОГИЙ

КАФЕДРА ИНФОРМАЦИОННЫХ И РОБОТОТЕХНИЧЕСКИХ СИСТЕМ

Отчет по лабораторной работе №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(); } } }