Что из этого видно снаружи
Слоёв четыре, но приложение обычно трогает десяток имён. Вот они.
Клиент
MinecraftClient создаётся
с
MinecraftClientOptions
(хост, порт, при необходимости прокси), открывает соединение через
ConnectAsync и дальше умеет немного:
ReadPacketsAsync(token)- поток входящих пакетов;ReadPacketAsync(token)- один пакет, если поток не нужен;SendAsync(packet, protocolVersion)- отправить типизированный пакет;SendRawAsync(id, body)- отправить готовые байты;CompressionThreshold- включить сжатие, когда сервер о нём сообщил;EnableEncryption(secret)- включить шифр начиная со следующего кадра;DisposeAsync- закрыть соединение и отпустить буферы.
Прокси
Сокет можно открыть не самому: в MinecraftClientOptions кладётся
IProxyClient, реализации - в
QuickProxyNet
(«Вход на сервер»).
Пакеты
IncomingPacket
и
OutgoingPacket
- общая валюта всех слоёв. У входящего есть номер и тело; тело - окно в буфер, которое живёт до следующего чтения («Буфер приёма»).
Каждый сгенерированный пакет знает свой идентификатор и умеет читать и писать
себя для конкретной версии протокола. Реестр
PacketRegistry
переводит номер в описание пакета, если это нужно вручную.
Обработчики
ClientboundHandler
(и
ServerboundHandler
для серверного направления) - база с методом на каждый пакет. Приложение
наследуется, переопределяет нужное и само переставляет Phase: фазы ведёт код
приложения («Фаза и направление»).
Номер, которого реестр не знает для этой версии, фазы и направления, приходит в
OnUnknown.
Мимо клиента
Иногда сокет свой, а разобрать пакеты хочется. Тогда берут
PacketStreamReader
и
PacketStreamWriter:
они читают и пишут по одному пакету поверх обычного Stream, без
MinecraftConnection.
Вокруг
SrvResolver находит настоящий
адрес сервера по SRV-записи домена.
LanServerDetector
слушает широковещательные объявления и отдаёт серверы, открытые в локальной
сети.