Краткая теория. Серверный сокет, поддерживающий общение с множеством клиентов одновременно, должен быть многопоточным

Серверный сокет, поддерживающий общение с множеством клиентов одновременно, должен быть многопоточным.

Каждый поток создаётся и управляется объектом класса java.lang.Thread. Для поддержки сокетов и функций ввода-вывода необходим импорт пакетов:

import java.net.*;

import java.io.*;

Одним из способов создать поток является расширение класса Thread (нить). Класс, расширяющий Thread, переопределяет метод run() данного класса (код выполняемый потоком). Чтобы поток получил право на выполнение, конструктор потока вызывает метод start(), унаследованный от Thread. При этом запустится метод run().

Пример работы с потоками:

public class Talk extends Thread {

public void run() {

for (int i = 0; i < 8; i++) {

System. out. println("Talking");

try {

Thread. sleep (400); // остановка на 400 миллисекунд

} catch (InterruptedException e) {

System. err. print(e);

}

}

}

}

public class TalkTalk {

public static void main(String[] args) {

Talk talk = new Talk();

talk.start();

}

}

Для реализации сервера необходимо создать поток, расширяющий класс Thread, который содержит метод run(), реализующий функции сервера.

Примечание: В нашем примере функции сервера заключаются в том, чтобы принять от клиента текстовую строку и вернуть её назад (см. лабораторную работу №2).

Пример:

import java.io.*;

import java.net.*;

import java.lang.*;

class Server extends Thread {

private Socket socket;

// Конструктор

public Server(Socket s) throws IOException {

socket = s;

… //реализация конструктора класса-сервера

start(); // вызываем run()

}

public void run() {

// реализация сервера

}

}

Кроме того, понадобится класс, содержащий метод main(), в котором создаётся «слушающий» сокет (ServerSocket), и который будет осуществлять соединение с клиентами.

Пример:

public class MultiJServer {

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

ServerSocket s = new ServerSocket(port);

try {

while (true) {

Socket socket = s.accept();

n e w Server(socket);

}

} catch (IOException e) {

socket.close();

} finally {

s.close();

}

}

}

Задание:

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

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

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

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

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

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

String str = keyboard.readLine();

4. Создать класс-сервер, расширяющий Thread, и содержащий метод run() для реализации функций сервера.

5. Создать класс, содержащий метод main(), и осуществляющий соединение с клиентскими сокетами.

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

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

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

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

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

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

12. Если есть такая возможность, обеспечить соединение нескольких клиентов, находящихся на разных компьютерах, с сервером.

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

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

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

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

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

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

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

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

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

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

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

1. Что такое многозадачность и многопоточность?

2. Какими способами можно организовать создание и работу потоков?

3. Для чего нужен метод start()?

4. Охарактеризуйте метод accept().

5. Перечислите классы и методы, входящие в состав класса ServerSocket.

6. Для чего служит конструкция try…catch…finally?


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



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