Краткая теория. В данной лабораторной работе используются классы и методы пакета java.net, поэтому в начале программы необходимо вставить строки импорта содержимого

В данной лабораторной работе используются классы и методы пакета java.net, поэтому в начале программы необходимо вставить строки импорта содержимого пакетов:

import java.net.*;

import java.io.*;

Вторая строка необходима для использования классов потокового ввода-вывода:

· InputStream

· OutputStream

· DataInputStream

· DataOutputStream

и их методов:

· getInputStream()

· getOutputStream()

для передачи данных от клиента к серверу и наоборот.

Для соединения компьютеров необходимо определить адрес узла, на котором будет запущен сервер и порт приложения, обрабатывающего полученную информацию.

Системными службами зарезервированы порты с 1 по 1024, поэтому для своего приложения можно использовать любой другой порт.

Чтобы получить java объект IP адреса хоста необходимо использовать статический метод InetAddress.getByName() класса InetAddress пакета java.net.

Приведённый ниже пример иллюстрирует использование метода InetAddress.getByName() для получения своего IP адреса в виде java объекта.


Пример:

// ip_Address.java

//Должно быть установлено соединение с Internet

import java.io.*;

import java.net.*;

public class ip_Address {

public static void main(String[] args) throws Exception {

BufferedReader keyboard = new BufferedReader(new InputStreamReader(System. in));

System. out. println("Введи имя компьютера");

String line = keyboard.readLine();

InetAddress addr = InetAddress. getByName (line);

System. out. println(addr);

}

}

При запуске клиента и сервера на одном компьютере необходимо использовать адрес «заглушки», так называемый localhost, который можно получить следующими способами:

InetAddress addr = InetAddress. getByName (null);

или:

InetAddress addr = InetAddress. getByName ("localhost");

или:

InetAddress addr = InetAddress. getByName ("127.0.0.1");

Существует два класса сокетов, основанных на потоках: ServerSocket, который использует сервер для "прослушивания" входящих соединений, и Socket, который использует клиент для инициализации соединения. Как только клиент создаст сокетное соединение, ServerSocket возвратит, используя свой метод accept(), соответствующий Socket, через который может происходить коммуникация на стороне сервера.

Пример (серверная часть):

int port = 6666;

// создание сокета сервера

ServerSocket ss = new ServerSocket(port);

// установление сервером соединения клиент-сервер,

// инициированного клиентом

Socket socket = ss.accept();

Для общения сокетов клиента и сервера используются методы getInputStream() и getOutputStream() для получения соответствующих объектов классов InputStream и OutputStream для каждого сокета. Для обработки потоков более удобно использовать потомки этих классов DataInputStream и DataOutputStream, которые содержат готовые методы чтения/записи всех типов данных readUTF()/ writeUTF.

Пример (клиентская часть):

Socket sock = new Socket(addr, port)

DataInputStream in = new DataInputStream (sock.getInputStream());

DataOutputStream out = new DataOutputStream (sock.getOutputStream());

String str = null;

while (true) { // бесконечный цикл сеанса связи

str in.readUTF(); // считывание данных из потока

out.writeUTF(); // запись данных в поток

out.flush(); // окончание потока передачи

}

По окончании сеанса связи сокеты необходимо закрыть методом close():

sock.close();

Для реализации соединения необходимо использовать конструкцию обработки исключений:

try { // попытка соединения }

catch { // не получилось }

finally { // выполнится в любом случае }

Пример:

try {

System.out.println("Успех");

} catch (Exception x) {

System.out.println("Ошибка");

x.printStackTrace(); //вывод содержимого стека

}

} finally {

sock.close();

}

Вместо конструкции try…catch…finally можно использовать оператор throws для задания списка исключений, которые могут возбуждаться методом.

Пример:

public static void main(String[] args) throws IOException {

}

Задание:

Создать два класса: Client и Server, использующие классы и методы пакета java.net, для связи двух процессов на основе протокола TCP. Проверить передачу текстовой строки от клиента серверу и обратно. Использовать созданные классы для продолжительного сеанса связи двух процессов. Обеспечить ввод с клавиатуры потоков данных для передачи клиентом серверу и обратно, окончание сеанса связи, и закрытие сокетов (клиента и сервера) по введённому с клавиатуры кодовому слову, например, «END».

Порядок выполнения работы:

1. Запустить среду Eclipse, установленную на компьютере.

2. Создать новый проект. Указать его название и местоположение.

3. Создать класс-клиент, содержащий метод main(). Добавить в класс средства для ввода строки с клавиатуры:

BufferedReader keyboard = new BufferedReader(new InputStreamReader(System. in));

String str = keyboard.readLine();

4. Создать класс-сервер, содержащий метод main().

5. Компилировать классы.

6. При необходимости исправить найденные ошибки и повторить п.5.

7. Запустить на выполнение класс-сервер.

8. Запустить на выполнение класс-клиент.

9. Проследить за передачей текста от клиента к серверу и обратно.

10. Обеспечить сеанс связи клиент-сервер до завершения его пользователем (передать несколько введённых с клавиатуры текстовых строк).

11. Если есть возможность, проверить работу клиент-серверного приложения на двух, соединённых в сеть, компьютерах.

12. Оформить отчёт.

13. Сдать работу.

Содержание отчёта:

1. Номер, название и цель лабораторной работы.

2. Задание по варианту.

3. Описание классов: их полей и методов.

4. Тексты классов.

5. Результаты работы программы.

6. Описание полученных результатов.

7. Вывод по проделанной работе.

Контрольные вопросы:

1. Чем передача данных по протоколу UDP отличается от передачи по протоколу TCP?

2. Что такое сокет?

3. Какие существуют разновидности архитектуры клиент-сервер?

4. Чем отличается класс ServerSocket от класса Socket?

5. Какие классы сокетов для протокола UDP вы знаете?

6. Какой пакет java используется для работы с сокетами?


Лабораторная работа №3

РАЗРАБОТКА МНОГОПОТОЧНОГО СОКЕТА

Цель работы: Изучение методов программирования многопоточных сокетов с использованием пакетов java.net и java.lang.

Подготовка к лабораторной работе:

1. Изучить лекционный материал дисциплины "Технологии разработки телекоммуникационных сервисов" по темам: "Архитектура клиент-сервер. Сокеты", "Разработка многопоточного сокета".

2. Изучить соответствующие разделы в литературе [1-4].

3. Повторить принципы работы в среде Eclipse.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: