Skip to content

Latest commit

 

History

History
226 lines (160 loc) · 8.62 KB

File metadata and controls

226 lines (160 loc) · 8.62 KB

ФИТ НГУ, курс ООП

Сетевое программирование

1

Напишите программу для общения через Интернет.

Программа должна состоять из двух частей: сервер и клиент.

Сервер запускается как отдельное приложение на определенном порту, который указан в конфигурационном файле.

Клиент, написанный с использованием библиотеки Swing(или JavaFX), подключается к серверу по имени сервера и номеру порта.

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

2

Минимальные возможности чата:

  • Каждый участник чата имеет собственный ник, который указывается при подключении к серверу.
  • Можно посмотреть список участников чата.
  • Можно отправить сообщение в чат (всем участникам).
  • Клиент показывает все сообщения, отправленные в чат с момента подключения, плюс некоторое количество сообщений, отправленных до подключения. Список сообщений обновляется в реальном времени.
  • Клиент отображает события, такие как подключение нового участника к чату и выход участника из чата. Сервер должен корректно обрабатывать отключение клиента от чата (по таймауту).
  • Сервер должен логировать все события, происходящие на его стороне (включается/отключается в конфигурационном файле).
  • Чат работает через TCP/IP протокол.

3

Необходимо создать 2 версии клиента и сервер который поддерживает оба протокола:

  • Первая версия использует сериализацию/десериализацию Java-объектов для отправки/приема сообщений.
  • Вторая версия использует XML сообщения (расширенная версия).

Выбор реализации производиться параметрами командной строки клиента.

4

Клиент и сервер должны поддерживать стандартный протокол для XML варианта. Это необходимо для возможности общения между клиентами, созданными разными учениками.

Протокол описан ниже. Расширения протокола приветствуются, например, можно добавить возможность выбора цвета сообщений пользователем.

В начале XML сообщения идут 4 байта (Java int) с его длиной. То есть сначала читаются первые 4 байта, чтобы узнать длину оставшегося сообщения (в байтах). Затем считывается само сообщение и обрабатывается как XML документ.

5

Рекомендуется использовать следующие техники:

  • Сервер слушает порт с помощью класса java.net.ServerSocket.
  • Клиент подключается к серверу с помощью класса java.net.Socket.
  • XML сообщение читается с помощью DOM parser: DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(). Сериализация/десериализация объекта выполняется через классы ObjectInputStream и ObjectOutputStream.

Минимальный протокол

Минимальный протокол взаимодействия для XML сообщений (расширения приветствуются):

Регистрация

Запрос:

<command name="login">
  <name>USER_NAME</name>
  <type>CHAT_CLIENT_NAME</type>
</command>

Ответ:

Server error answer

<error>
  <message>REASON</message>
</error>

Server success answer

<success>
  <session>UNIQUE_SESSION_ID</session>
</success>

Запрос списка пользователей чата

Запрос:

<command name="list">
  <session>UNIQUE_SESSION_ID</session>
</command>

Ответ:

Server error answer

<error>
  <message>REASON</message>
</error>

Server success answer

<success>
  <listusers>
    <user>
      <name>USER_1</name>
      <type>CHAT_CLIENT_1</type>
    </user>
    ...
    <user>
      <name>USER_N</name>
      <type>CHAT_CLIENT_N</type>
    </user>
  </listusers>
</success>

Сообщение от клиента серверу

Запрос:

<command name="message">
  <message>MESSAGE</message>
  <session>UNIQUE_SESSION_ID</session>
</command>

Ответ:

Server error answer

<error>
  <message>REASON</message>
</error>

Server success answer

<success>
</success>

Сообщение от сервера клиенту

Сообщение:

<event name="message">
  <message>MESSAGE</message>
  <name>CHAT_NAME_FROM</name>
</event>

Новый клиент:

<event name="userlogin">
  <name>USER_NAME</name>
</event>

Пользователь покинул чат:

<event name="userlogout">
  <name>USER_NAME</name>
</event>

Отключение

Запрос:

<command name="logout">
  <session>UNIQUE_SESSION_ID</session>
</command>

Ответ:

Server error answer

<error>
  <message>REASON</message>
</error>

Server success answer

<success>
</success>

Основные требования

  1. Для обеспечения многопоточной неблокирующей обработки нескольких клиентов можно воспользоваться библиотекой java.nio.channels.
    • ServerSocketChannel - для прослушивания в неблокирующем режиме.
    • SocketChannel - для чтения данных в неблокирующем режиме.
    • Selector - для одновременного получения данных от нескольких клиентов и чтения данных из этих каналов (используется в связке с ServerSocketChannel и SocketChannel) или произвести реализацию с использованием виртуальных потоков.
  2. Создать javadoc документацию для всех классов и методов.
  3. Написать readme-файл с инструкцией по установке, запуску калькулятора.
  4. Добавить нагрузочные и стресс-тесты для оценки производительности решения.

Расширенные требования (на автомат)

  1. Реализация механизма сохранения состояния чата: Сервер должен сохранять историю сообщений и список участников чата между перезапусками. История сообщений должна быть доступна новым участникам чата с момента их подключения.
  2. Реализация механизма проверки подлинности: Добавить возможность регистрации новых пользователей с паролем и авторизации существующих. Проверка уникальности никнеймов при регистрации с использрванием хеша от пароля пользователя.