Перейти к основному содержимому

Что из этого видно снаружи

Слоёв четыре, но приложение обычно трогает десяток имён. Вот они.

Клиент

MinecraftClient создаётся с MinecraftClientOptions (хост, порт, при необходимости прокси), открывает соединение через ConnectAsync и дальше умеет немного:

  • ReadPacketsAsync(token) - поток входящих пакетов;
  • ReadPacketAsync(token) - один пакет, если поток не нужен;
  • SendAsync(packet, protocolVersion) - отправить типизированный пакет;
  • SendRawAsync(id, body) - отправить готовые байты;
  • CompressionThreshold - включить сжатие, когда сервер о нём сообщил;
  • EnableEncryption(secret) - включить шифр начиная со следующего кадра;
  • DisposeAsync - закрыть соединение и отпустить буферы.

Прокси

Сокет можно открыть не самому: в MinecraftClientOptions кладётся IProxyClient, реализации - в QuickProxyNet («Вход на сервер»).

Пакеты

IncomingPacket и OutgoingPacket

  • общая валюта всех слоёв. У входящего есть номер и тело; тело - окно в буфер, которое живёт до следующего чтения («Буфер приёма»).

Каждый сгенерированный пакет знает свой идентификатор и умеет читать и писать себя для конкретной версии протокола. Реестр PacketRegistry переводит номер в описание пакета, если это нужно вручную.

Обработчики

ClientboundHandlerServerboundHandler для серверного направления) - база с методом на каждый пакет. Приложение наследуется, переопределяет нужное и само переставляет Phase: фазы ведёт код приложения («Фаза и направление»). Номер, которого реестр не знает для этой версии, фазы и направления, приходит в OnUnknown.

Мимо клиента

Иногда сокет свой, а разобрать пакеты хочется. Тогда берут PacketStreamReader и PacketStreamWriter: они читают и пишут по одному пакету поверх обычного Stream, без MinecraftConnection.

Вокруг

SrvResolver находит настоящий адрес сервера по SRV-записи домена. LanServerDetector слушает широковещательные объявления и отдаёт серверы, открытые в локальной сети.