Вверх ↑
Этот топик читают: Гость
Ответов: 247
Beta
лидер
#1: 2013-01-06 18:48:36 ЛС | профиль | цитата

Minecraft изнутри - статья 2, сеть


Окей, продолжаем, и уже более серьезное.

В этом посте мы разберем, как майнкрафт работает с сетью.
Схема


Не особо понятно, не так ли? Сейчас разберемся.


Заведует сетью у нас класс TcpConnection - Б-г всея network-a майнкрафта. При старте он запускает два потока, отвечающих за чтение и прием данных: TcpReaderThread и TcpWriterThread
Этот класс отвечает за получение\отправку пакетов, а так же обработку принятых.

При остановке сетевого обработчика запускается TcpMasterThread, выполняющий нехитрую функцию - получает из TcpConnection оба потока и останавливает их, если они еще не остановились.



TcpReaderThread читает буфер на появление новых пакетов с некоторой переодичностью, помещая их в TcpConnection.readPackets, с последующим дерганьем NetHandler, для клиента - свой, для сервера - свой. Сам же NetHandler сопоставлял пришедший пакет конструкцией вида
if(packet instanceof Packet1Login) {
...
}elseif(...) {
...
}
...раньше. Сейчас используется слегка другой алгоритм, на списках и маппинге классов, спасибо Assasin, что напомнил
и вызывает соответствующую функцию.



TcpWriterThread отправляет пакеты, которые мы передаем в TcpConnection функцией addToSendQueue. Они накапливаются в TcpConnection.dataPackets и постепенно захватываются нашим потоком. Тут не происходит ничего особенного


Так же TcpConnection следит за таймаутами подключений и закрывает соединение, если не дожидается ответа.

В принципе, сеть реализована неплохо, но использование стандартного java.io.* очень сильно снижает производительность.
А еще я реализовывал в одном из своих проектов аналог TcpConnection, исходники есть на GitHubНе сработает для Galaxy, хехе

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

901 специально для MCGL. При копировании указание копирайта обязательно.

карма: 0
0
Разработчик
Ответов: 3015
NeverClan
[W] Inactive
#2: 2013-01-06 19:03:31 ЛС | профиль | цитата
Mr_Sumato писал(а):
Сам же NetHandler сопоставляет пришедший пакет конструкцией вида

Чушь, там используется карта классов с виртуальным методом processPacket, ибо это намного гибче.
карма: 125
0
Ответов: 247
Beta
лидер
#3: 2013-01-06 19:05:00 ЛС | профиль | цитата
Assasin, упустил же, ну
карма: 0
0
3
Сообщение
...