Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Разработчик Дубаков А.А.
Постановка задачи
Необходимо разработать клиент/серверное приложение, в котором сервер может распространять сообщения всем клиентам, зарегистрированным в группе 233.0.0.1, порт 1502. Пользователь сервера должен иметь возможность ввода и отправки текстовых сообщений, а пользователь-клиент просматривает полученные сообщения.
Для решения поставленной задачи необходимо выполнить следующие шаги:
Подготовительный этап
Для реализации проекта необходимо установить и настроить среду разработки Ecplise (см. п. «Установка и настройка программного обеспечения»).
Создание нового проекта
Создание класса Server
Класс Server предназначен для отсылки сообщений всем клиентам, зарегистрированным в группе 233.0.0.1. Создание класса Server включает в себя следующие основные задачи:
Код класса Server приведен ниже:
package ru.tpu.javaEELabs.lab2;
import java.io.*;
import java.net.*;
public class Server {
private BufferedReader in = null;
private String str = null;
private byte[] buffer;
private DatagramPacket packet;
private InetAddress address;
private DatagramSocket socket;
public Server() throws IOException {
System.out.println("Sending messages");
// Создается объект DatagramSocket, чтобы
// принимать запросы клиента
socket = new DatagramSocket();
// Вызов метода transmit(), чтобы передавать сообщение всем
// клиентам, зарегистрированным в группе
transmit();
}
public void transmit() {
try {
// создается входной поток, чтобы принимать
// данные с консоли
in = new BufferedReader(new InputStreamReader(System.in));
while (true) {
System.out.println(
"Введите строку для передачи клиентам: ");
str = in.readLine();
buffer = str.getBytes();
address = InetAddress.getByName("233.0.0.1");
// Посылка пакета датаграмм на порт номер 1502
packet = new DatagramPacket(
buffer,
buffer.length,
address,
1502);
//Посылка сообщений всем клиентам в группе
socket.send(packet);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
// Закрытие потока и сокета
in.close();
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void main(String arg[]) throws Exception {
// Запуск сервера
new Server();
}
}
Создание класса Client
Класс Client позволяет клиенту присоединиться к группе 233.0.0.1 для получения сообщений от сервера. Создание класса Client включает в себя следующие основные задачи:
Код класса Client приведен ниже:
package ru.tpu.javaEELabs.lab2;
import java.net.*;
public class Client {
private static InetAddress address;
private static byte[] buffer;
private static DatagramPacket packet;
private static String str;
private static MulticastSocket socket;
public static void main(String arg[]) throws Exception {
System.out.println("Ожидание сообщения от сервера");
try {
// Создание объекта MulticastSocket, чтобы получать
// данные от группы, используя номер порта 1502
socket = new MulticastSocket(1502);
address = InetAddress.getByName("233.0.0.1");
// Регистрация клиента в группе
socket.joinGroup(address);
while (true) {
buffer = new byte[256];
packet = new DatagramPacket(
buffer, buffer.length);
// Получение данных от сервера
socket.receive(packet);
str = new String(packet.getData());
System.out.println(
"Получено сообщение: " + str.trim());
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
// Удаление клиента из группы
socket.leaveGroup(address);
// Закрытие сокета
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
Запуск и тестирование
Каждый из построенных классов Client и Server содержит метод main() и является, по сути, отдельным приложением, которое может быть запущено на отдельной машине, подключенной к сети, при этом по умолчанию область видимости передачи групповых сообщений (multicasting scope) ограничивается подсетью сервера. В нашем случае роль клиента и сервера будет выполнять один и тот же компьютер.
Постановка задачи
Необходимо разработать клиент/серверное приложение, в котором сервер слушает запросы клиентов на порт 1500 и отправляет объект-сообщение содержащий текущую дату/время сервера и строку сообщения. Пользователь-клиент должен иметь возможность просмотра полученного сообщения.
Для решения поставленной задачи необходимо выполнить следующие шаги:
Подготовительный этап
Для реализации проекта необходимо установить и настроить среду разработки Ecplise (см. п. «Установка и настройка программного обеспечения»).
Создание класса DateMessage
package ru.tpu.javaEELabs.lab2;
import java.io.Serializable;
import java.util.Date;
public class DateMessage implements Serializable {
private Date date;
private String message;
public DateMessage(Date date, String message) {
this.date = date;
this.message = message;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
Создание класса ServerTCP
Создание класса ServerTCP включает в себя следующие основные задачи:
Код класса Server приведен ниже:
package ru.tpu.javaEELabs.lab2;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Calendar;
/**
* Класс сервера (выполняется в отдельном процессе)
*/
public class ServerTCP extends Thread {
// Объявляется ссылка
// на объект - сокет сервера
ServerSocket serverSocket = null;
/**
* Конструктор по умолчанию
*/
public ServerTCP() {
try {
// Создается объект ServerSocket, который получает
// запросы клиента на порт 1500
serverSocket = new ServerSocket(1500);
System.out.println("Starting the server ");
// Запускаем процесс
start();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* Запуск процесса
*/
public void run() {
try {
while (true) {
// Ожидание запросов соединения от клиентов
Socket clientSocket = serverSocket.accept();
System.out.println("Connection accepted from " + clientSocket.getInetAddress().getHostAddress());
// Получение выходного потока,
// связанного с объектом Socket
ObjectOutputStream out =
new ObjectOutputStream(
clientSocket.getOutputStream());
// Создание объекта для передачи клиентам
DateMessage dateMessage = new DateMessage(
Calendar.getInstance().getTime(),
"Текущая дата/время на сервере");
// Запись объекта в выходной поток
out.writeObject(dateMessage);
out.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String args[]) {
// Запуск сервера
new ServerTCP();
}
}
Создание класса ClientTCP
Класс ClientTCP позволяет клиенту присоединиться к серверу, используя его IP-адрес (в нашем случае localhost) и получить от него сообщение. Создание класса ClientTCP включает в себя следующие основные задачи:
Код класса Client приведен ниже:
package ru.tpu.javaEELabs.lab2;
import java.io.ObjectInputStream;
import java.net.Socket;
public class ClientTCP {
public static void main(String args[]) {
try {
// Создается объект Socket
// для соединения с сервером
Socket clientSocket = new Socket("localhost", 1500);
// Получаем ссылку на поток, связанный с сокетом
ObjectInputStream in =
new ObjectInputStream(clientSocket.getInputStream());
// Извлекаем объект из входного потока
DateMessage dateMessage =
(DateMessage) in.readObject();
// Выводим полученные данные в консоль
System.out.println(dateMessage.getMessage());
System.out.println(dateMessage.getDate());
} catch (Exception e) {
e.printStackTrace();
}
}
}
Запуск и тестирование
Щелкните правой кнопкой мыши на класс ServerTCP в окне Package Explorer и выберите команду Run As/Java Application. В консоли отображается сообщение Starting the server.
Проделайте то же самое с классом ClientTCP. При запуске клиент пытается соединиться с сервером и обрабатывает полученное сообщение. В результате в консоли клиента выводится следующее:
Выберите консоль сервера и просмотрите сообщение о приеме соединения от клиента:
Варианты заданий
1. Необходимо разработать клиент/серверное приложение, в котором сервер каждые 10 секунд распространяет некоторое текстовое сообщение, например, о погоде, всем промежуточным клиентам, зарегистрированным в группе 233.0.0.1, порт 1502 с помощью UDP. Текст сообщения хранится в текстовом файле на сервере. Промежуточный клиент фильтрует полученные сообщения и в случае изменения содержимого отображает его в консоли. Для конечного клиента промежуточный клиент выступает сервером. Конечный клиент присоединяется к промежуточному и получает тексты последних пяти отфильтрованных сообщений (с помощью протокола TCP/IP). Необходимо снабдить приложение конечного клиента графическим интерфейсом.
2. Разработать приложение для широковещательного общения пользователей (чат). Клиент отсылает сообщение серверу (с помощью протокола TCP/IP). Сервер накапливает порции сообщений и каждые 10 секунд распространяет очередную порцию сообщений всем клиентам, зарегистрированным в группе 233.0.0.1, порт 1502 с помощью UDP. Если за указанный период не поступило ни одного нового сообщения, то рассылка не производится. Клиент принимает сообщения и отображает их на экране. Клиентское приложение должно иметь удобный графический интерфейс для ввода новых и просмотра полученных сообщений.