This repository was archived by the owner on Sep 9, 2021. It is now read-only.
Ворошилов Алексей /70203 lab1ab #124
Closed
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Лабораторная работа №1 (a & b)
Kotlin (версия Kotlin 1.4.30, Java 15.0.2).
Gradle (версия 6.8.3) (>6.3 required)
Описание
TCP-чат. Для отключения от сеанса клиент вводит "quit".
IP и порт назначаются в текстовом документе в той же папке: address.txt:
Ex:
127.0.0.1:8080
bserver
bclient
nbserver
nbclient
Инструкция по использованию
gradle all
java -jar {выбранный сеанс}.jar
Описание используемого протокола.
Блокирующий сокет:
Основан в текущем случае на ObjectStream. Сообщение будет кодироваться/декодироваться и передаваться/приходить с непрерывным потоком данных, поэтому это влияет на задержку в общении внутри существующего сеанса, потому что использование потоков влечет накладные расходы ОС на их переключение. Де-факто они становятся критическими при сотнях активных потоках на одно ядро ЦП или при тысячах потоков на всю систему. Современные нагрузки предполагают десятки тысяч активных соединений одновременно или миллионы малоактивных, поэтому для них порождать поток на каждое соединение неприемлемо.
В нашем случае разницу сложно ощутить из-за отстутствия широты эксперимента, но видно, что... :
... Блокирующие сокеты неудобны тем, что позволяют либо принимать данные из сокета, либо отправлять их. Это приемлемо, если клиент и сервер обмениваются запросами в строгой очередности. Однако, если любая сторона может как принимать, так и отправлять данные по своему усмотрению (например, мессенджер), требуется или два соединения (расход сокетов), или два потока (накладные расходы, описанные выше).
В любом случае, на практике чаще при больших потребностях используются неблокирующие сокеты.
Неблокирующий сокет:
Cлушающий процесс не должен делать каких-либо блокирующих вызовов и быстро реагировать на входящие сообщения, не вызывая таймауты: SocketChannelUtils.kt для создания потока сообщений по SocketChannel, где главным наличием является буферизированное чтение и запись сообщений.
Но самое важное - наличие Key - это говорит о том, что у сокета появляются разные состояния, влияющие на допуск к операциям с ним.