Skip to content
This repository has been archived by the owner on Sep 9, 2021. It is now read-only.

Романов Алексей 3530901/70201 lab1 (a and b) #66

Closed
wants to merge 7 commits into from

Conversation

Lexcorp3439
Copy link

No description provided.

@Lexcorp3439
Copy link
Author

Lexcorp3439 commented Jan 6, 2021

Лабораторная работа 1

Сборка

Сборка осуществляется с помощью Maven и JDK 1.8.
Для удобства в репозиторий помещён Maven Wrapper.
Эта утилита скачает необходимую версию Maven.
Таким образом в системе должен присутствовать только JDK 1.8.

Команда сборки:

./mvnw package

После сборки в каждом сабмодуле будет сгенерирована папка таргет, внутри которой будет jat-файл.

Запуск

Запустить сервер можно из основного модуля выполнив команду:

java -jar <module>/target/<module>-1.0-SNAPSHOT.jar <аргументы>

Исполняемых всего 4 модуля:

  1. server
  2. client
  3. nio-server
  4. nio-client

*Модули с приставкой nio - модули на неблокирующих сокетах.

Запуск каждого модуля:

server

java -jar server/target/server-1.0-SNAPSHOT.jar [-p PORT] [-h HOST]

client

java -jar client/target/client-1.0-SNAPSHOT.jar [-p PORT] [-h HOST] [-u USERNAME]

nio-server

java -jar nio-server/target/nio-server-1.0-SNAPSHOT.jar [-p PORT] [-h HOST]

nio-client

java -jar nio-client/target/nio-client-1.0-SNAPSHOT.jar [-p PORT] [-h HOST]

Описание опций:

  • -h -- идентификатор сервера в виде IP адреса (по смыслу должен быть адрес хоста). По умолчанию localhost
  • -p -- порт, который следует прослушивать
  • -u -- имя пользователя

Протокол

Имеется один общий тип пакета, он отправляется от клиента к серверу и от сервера клиенту.
В пунктах a и b структура пакета не меняется
Формат пакета:

Name length Name Message length Message End

Name length и Message length занимают по 1 байту, то есть максимальная длина сообщения и имени - 127 символов.
Флаг End показывает последние ли сообщение из общего потока.
Данный влаг нужен для того, чтобы передавать по частям большое сообщение от пользователя.
Name и Message передаются в формате utf-8.
Время сообщения возлагается на клиентов, по причине того, что у пользователей могут быть разные часовые пояса.

Реализация

Реализация обоих пунктов похожа, за исключением самих сокетов. Обычные сокеты были взяты из пакета java.net, а неблокирующие взяты из java.nio.

СЕРВЕР

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

КЛИЕНТ

При запуске клиента также считываются аргументы командной строки, у пользователя запрашивается имя. Имя отправляется вместе с каждым сообщением, так как имена пользователей не хранятся на сервере. Выйти из программы можно с помощью команды "quit". Если запустить клиент, а сервер в этот момент не будет работать, выведется соответсвтующее сообщение и программа завершит работу.

@wrbbz
Copy link
Contributor

wrbbz commented Jan 7, 2021

  • Хранить уже собранные .jar файлы в репе - не есть хорошая идея
  • Не хватает описания процесса сборки исходных файлов
  • В отчете не хватает описания аргументов принимаемых сервером/клиентом
  • При завершении сервера (блокирующие сокеты), клиент на действия отправки вываливает Exceptoin Broken pipe. Его нужно обработать один раз и завершить клиент
  • При запуске сервера в формате: -a ${your ip} -p 1843 вываливается исключение формата java.net.UnknownHostException: addr is of illegal length
  • Сервер в неблокирующей реализации импортит сервер блокирующей реализации

UPD:

  • Отсутствует проверка на уникальность ника (не может быть двух клиентов с одним ником)
  • При запуске неблокирующй реализации сервера на 0.0.0.0 к нему не подключиться используя IP адрес машины (не локалхост и не 0.0.0.0)

@Lexcorp3439
Copy link
Author

Lexcorp3439 commented Jan 8, 2021

#66 (comment)
Сервер в неблокирующей реализации импортит сервер блокирующей реализации

Не очень понял где.
Вот импорты в сервере неблокирующей реализации:

import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

import com.github.lexcorp3439.net.lab1.protocol.Protocol;
import com.github.lexcorp3439.net.lab1.protocol.ProtocolHelper;

Пакет для неблокирующих сокетов - java.nio
То, что используются некоторые классы из java.net это нормально.

Хранить уже собранные .jar файлы в репе - не есть хорошая идея

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

При запуске неблокирующй реализации сервера на 0.0.0.0 к нему не подключиться используя IP адрес машины (не локалхост и не 0.0.0.0)

Я сейчас немного подредактировал опции, на данный момент все работает.
Запустил сервер с аргументами:
-p 1234 -h 0.0.0.0
Запустил 2 клиента с аргументами:
-p 1234 -h 192.168.1.55
Соединение успешно, чат работает

Отсутствует проверка на уникальность ника (не может быть двух клиентов с одним ником)

Это дело поправил:)))

Добавил инструкцию по сборке, удалил jar-ники
В отчет все добавил
Разбил проект на подмодули, чтобы было удобнее все собирать

Split the project into submodules
Fix bags
@wrbbz
Copy link
Contributor

wrbbz commented Jan 8, 2021

В большинстве своем отношусь с недоверием к пресобранным бинарям в репе. Ибо неизвестно с чем они были собраны, как и где

Ошибка сборки:

➜ ./mvnw package
[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Build Order:
[INFO]
[INFO] 2020H2                                                             [pom]
[INFO] protocol                                                           [jar]
[INFO] server                                                             [jar]
[INFO] client                                                             [jar]
[INFO] nio-server                                                         [jar]
[INFO] nio-client                                                         [jar]
[INFO]
[INFO] ---------------------------< 2020H2:2020H2 >----------------------------
[INFO] Building 2020H2 1.0-SNAPSHOT                                       [1/6]
[INFO] --------------------------------[ pom ]---------------------------------
[INFO]
[INFO] --------------------------< 2020H2:protocol >---------------------------
[INFO] Building protocol 1.0-SNAPSHOT                                     [2/6]
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ protocol ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory /tmp/2020H2/protocol/src/main/resources
[INFO]
[INFO] --- maven-compiler-plugin:3.8.1:compile (default-compile) @ protocol ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 3 source files to /tmp/2020H2/protocol/target/classes
javacTask: source release 8 requires target release 1.8
[INFO] -------------------------------------------------------------
[ERROR] COMPILATION ERROR :
[INFO] -------------------------------------------------------------
[ERROR] An unknown compilation problem occurred
[INFO] 1 error
[INFO] -------------------------------------------------------------
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary for 2020H2 1.0-SNAPSHOT:
[INFO]
[INFO] 2020H2 ............................................. SUCCESS [  0.006 s]
[INFO] protocol ........................................... FAILURE [  1.061 s]
[INFO] server ............................................. SKIPPED
[INFO] client ............................................. SKIPPED
[INFO] nio-server ......................................... SKIPPED
[INFO] nio-client ......................................... SKIPPED
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  1.232 s
[INFO] Finished at: 2021-01-08T16:50:32+03:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project protocol: Compilation failure
[ERROR] An unknown compilation problem occurred
[ERROR]
[ERROR] -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException
[ERROR]
[ERROR] After correcting the problems, you can resume the build with the command
[ERROR]   mvn <args> -rf :protocol

Java:

➜ java -version
openjdk version "1.8.0_265"
OpenJDK Runtime Environment (build 1.8.0_265-b01)
OpenJDK 64-Bit Server VM (build 25.265-b01, mixed mode)

Maven:

➜ mvn -version
Apache Maven 3.6.3 (NON-CANONICAL_2019-11-27T20:26:29Z_root)
Maven home: /opt/maven
Java version: 1.8.0_265, vendor: Oracle Corporation, runtime: /usr/lib/jvm/java-8-openjdk/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "5.9.14-arch1-1", arch: "amd64", family: "unix"

@Lexcorp3439
Copy link
Author

Сейчас ошибки быть не должно

@wrbbz
Copy link
Contributor

wrbbz commented Jan 10, 2021

Да. Сборка прошла, однкао оба клиента не работают. Вываливается одинаковое исключение:

Exception in thread "main" java.lang.NoClassDefFoundError: com/github/lexcorp3439/net/lab1/protocol/Utils
	at com.github.lexcorp3439.net.lab1.b.client.NIOClient.createClient(NIOClient.java:109)
	at com.github.lexcorp3439.net.lab1.b.client.NIOClient.main(NIOClient.java:99)
Caused by: java.lang.ClassNotFoundException: com.github.lexcorp3439.net.lab1.protocol.Utils
	at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:352)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
	... 2 more

@Lexcorp3439
Copy link
Author

Ошибку устранил.
Проверил работоспособность - все работает.

@wrbbz
Copy link
Contributor

wrbbz commented Jan 11, 2021

Не работает переподключение к серверу. Даже с другим ником. Из другого терминала.
В обеих реализациях. Возникла проблема после отключения одного клиента от сервера через Ctrl + C

@Lexcorp3439
Copy link
Author

Исправил)

@wrbbz
Copy link
Contributor

wrbbz commented Jan 14, 2021

Принято

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants