Сообщений: 18
Тем: 1
Зарегистрирован: Aug 2012
Репутация:
40
Всем доброго времени!
Пожалуйста знатоки подскажите.
Порт 2106 закрыт.
После запуска Login server'a он его открывает.
Я никак не могу понять, "Игровой клиент", он отправляет данные на открытый сокет Login-server'a ?
Или, что там происходит, мне очень хочется это знать.
Пожалуйста объясните...
Как там происходит взаимодействие клиент с login-server'om.
И для чего еще один порт 9014?
И еще пожалуйста, кто-нибудь скажите где в коде происходит обработка кнопки "Войти"?
Прошу помогите пожалуйста! Будьте так сказачна любезны
Сообщений: 1,759
Тем: 13
Зарегистрирован: May 2011
Репутация:
3,205
реакция на кнопку пойти - обрабатывается в логине, пакет - RequestAuthLogin
порт 9014 используется для связи login<->server
Сообщений: 18
Тем: 1
Зарегистрирован: Aug 2012
Репутация:
40
linliss Написал:реакция на кнопку пойти - обрабатывается в логине, пакет - RequestAuthLogin
порт 9014 используется для связи login<->server
Спасибо, но там оторвано еще куда, то видимо...
Само нажатие ивента так и не увидел, или там не так?)
Объясните как, вообще запутался.
Там столько кода и файлов, это же вообще жесть.
Взял чисто случайно сборку с исходами l2jfrozen.
Кто писал сервер себя не жалел видимо...
А других темболее.
У меня главная проблема, это вот эта, все остальное нет проблем.
Разобрался.
А вот с этими соединениями никак не могу понять.
Прошу можешь поподробнее объяснить!?
Сообщений: 92
Тем: 3
Зарегистрирован: Jul 2011
Репутация:
194
Объяснить могу попробовать йа. Значится, сетевой обмен "клиент-сервер" выглядит примерно следующим образом (в общих чертах, конечно)...
Со стороны клиента: Посылка какого-либо запроса - это почти всегда реакция на какое либо действие пользователя. В общем случае, при нажатии на что-либо, клиент формирует пакет, привязанный к этому "что-либо", заполняя его поля значениями в определенном порядке (это, например, имя аккаунта и хеш от пароля для реквестАутЛогин), шифрует и кидает "на шину". Естественно, при таком раскладе, никаких эвентов нажатий (боже мой, делфи, что ли?) вы не найдете, поскольку исходников клиентской части у вас банально нет.
Зато у вас имеются исходники серверной части. И вот тут уже всё несколько более прозрачно.
Обычно джава-сервера используют "либу" mmocore, которая предоставляет набор базовых сетевых функций, в каком-то роде "заточенных" под многопользовательскую платформу... Затем к этой либе аттачится криптомодуль, который по получении пакета расшифровывает содержимое и отправляет на обработку.
Дальше происходит совсем уж примитивная вещь - большой такой, допустим, оператор выбора по значению первого байта полезной нагрузки пакета... Благодаря этому первому байту, происходит осознание того, что делать со всеми остальными байтами, и какая у них смысловая нагрузка.
Соответственно, когда мы понимаем, какой пакет к нам пришел, мы дергаем соответствующую функцию-обработчик, которая (как правило) и обеспечивает нам реакцию на событие - то есть отсылку данных клиенту. Клиент в свою очередь делает нечто похожее. И так далее.
И поскольку у вас есть исходники, реакцию на событие со стороны сервера можно модифицировать... А можно не модифицировать, и оставить "как есть", до обретения просветления в этой области.
Помимо этого, сервер может отправлять клиенту данные не благодаря запросам от оного, но благодаря реализованным алгоритмам... (такие вещи, как запуск анимации заклинания, например, другими персонажами).
Надеюсь, изложил более-менее понятно, хотя старался как можно короче, и поэтому многое (например, как именно происходит идентификация клиента) я просто опустил "для ясности"
Если бы в Java работал GC, большинство программ удаляли бы сами себя при первом же запуске
Сообщений: 18
Тем: 1
Зарегистрирован: Aug 2012
Репутация:
40
В том, то все и дело, я не пойму, что там куда отправляется и где, что принимается...
Вообще не врубэйшен.
Можешь помочь разобраться!?
Ну пробую представить:
Я жму вход, что там формируется, пакет?
Мне бы понять бы как вот это устроенно, все все вопросы бы сразу отпали...
У меня в этом только сложность, я не пойму как там устроенна связь, а очень нужно...
Помогите! Кто, чем сможет, может быть детально информация есть?!
Я не прошу за меня все писать коды и т.д., мне нужно, чтобы я хотябы понял что писать.
Конкретно хочу понять как работает.
Мне только это и нужно....
Большое спасибо, что помогаете.
Прошу постарайтесь разжевать и если можно показать, примером, будет вообще супер.
Благодарю, за все, очень сильно помогаете.
Сообщений: 144
Тем: 9
Зарегистрирован: Jul 2012
Репутация:
2,152
После нажатия кнопки войти - клиент устанавливает соединение с логин сервером. После того, как соединение установлено - начинается обмен пакетами.
Первый пакет отсылает логин сервер, Это пакет LoginInit(0x00), в котором отсылается открытый RSA ключ, blowFish ключ, и так называемый идентификатор сессии(sessionId).
Клиент в ответ на этот пакет присылает пакет AuthGameGuard, в котором возвращает sessionId.
Если он совпадает с отосланым, сервер отсылает пакет GGAuth, в ответ на который клиент присылает RequestAuthLogin, который содержит в себе логин и пароль игрока, зашифрованные с помощью отосланного ранее открытого RSA ключа.
Ещё раз кратко:
©lient: -> (L)oginserver: Запрос на подключение
Логин сервер устанавливает соединение...
L -> C: LoginInit
C -> L: AuthGameGuard
L -> C: GGAuth
C -> L: RequestAuthLogin
Сообщений: 92
Тем: 3
Зарегистрирован: Jul 2011
Репутация:
194
Ох-хо... Обычно, если люди хотят понять, как работает "вообще сеть", я рекомендую какой-нить ваершарк. Сниффер такой.
А в случае с линеечкой, думаю, более чем идеально подойдет l2ph. Его можно скачать, поставить, запустить, и с его помощью наглядно собственными глазами увидеть, "пошчупать", что, куда, когда и даже "зачем" посылается.
А читать курс о сетях, сетевых протоколах, конкретном протоколе конкретной игры и разработке софта с реалиацией оного протокола, а также о языках программирования высокого уровня вообще, джаве в частности и ОО-подходе к разработке у меня банально нет ни времени, ни желания, уж не обессудьте.
Если бы в Java работал GC, большинство программ удаляли бы сами себя при первом же запуске
Сообщений: 18
Тем: 1
Зарегистрирован: Aug 2012
Репутация:
40
Camelion Написал:После нажатия кнопки войти - клиент устанавливает соединение с логин сервером. После того, как соединение установлено - начинается обмен пакетами.
Первый пакет отсылает логин сервер, Это пакет LoginInit(0x00), в котором отсылается открытый RSA ключ, blowFish ключ, и так называемый идентификатор сессии(sessionId).
Клиент в ответ на этот пакет присылает пакет AuthGameGuard, в котором возвращает sessionId.
Если он совпадает с отосланым, сервер отсылает пакет GGAuth, в ответ на который клиент присылает RequestAuthLogin, который содержит в себе логин и пароль игрока, зашифрованные с помощью отосланного ранее открытого RSA ключа.
Ещё раз кратко:
©lient: -> (L)oginserver: Запрос на подключение
Логин сервер устанавливает соединение...
L -> C: LoginInit
C -> L: AuthGameGuard
L -> C: GGAuth
C -> L: RequestAuthLogin
О как уже начинаю, понимать!
Большущее, спасибо...
Gubble, я все конечно понимаю, но если нет желания, то конечно я не настаиваю.
Думаю, возможно найдутся, те, у кого будет хоть, немного желания...
Я просто никогда не задавался таким вопросом, а теперь мне это понадобилось и я пытаюсь получить как можно больше точной информации...
Camelion, Большое спасибо за подсказку....
LoginInit... А вот его я что-то не увидел, GGAuth такой класс имеется.
RSA - откуда берется? blowFish, а это?)
Сообщений: 144
Тем: 9
Зарегистрирован: Jul 2012
Репутация:
2,152
Попробуйте вместо LoginInit поискать просто Init.
RSA и BlowFish ключи генерируются в нужные моменты. У меня этим занимается вот такой класс:
PHP код: <?php
public final class KeyGenerator {
/**
* Генерирует RSA ключи
*/
public static ScrambledKeyPair generateScrambledKeyPair() {
KeyPairGenerator keygen;
try {
keygen = KeyPairGenerator.getInstance("RSA");
RSAKeyGenParameterSpec spec = new RSAKeyGenParameterSpec(1024, RSAKeyGenParameterSpec.F4);
keygen.initialize(spec);
} catch (NoSuchAlgorithmException | InvalidAlgorithmParameterException e) {
e.printStackTrace();
return null;
}
return new ScrambledKeyPair(keygen.generateKeyPair());
}
/**
* Генерирует Blowfish ключ
*
* @return blowFish ключ
*/
public static byte[] generateBlowfishKey() {
byte[] key = new byte[16];
for (int i = 0; i < key.length; i++) {
key[i] = (byte) (Rnd.get(255) + 1);
}
return key;
}
}
Сообщений: 18
Тем: 1
Зарегистрирован: Aug 2012
Репутация:
40
Camelion, ну хоть теперь уже становится более наглядно и понятно...
Спасибо, что помогаешь...
Там такой ужас, что вообще =)
Разветвлений там просто даталова много...
Понапичкано, там наверное можно сидеть, щелкать, щелкать, щелкать и конца не увидешь...
Куда столько...
Init класс нашел:
Что-то там все так запутанно, что просто дурдом какой-то.
Толи, специально, толи, что не пойму, куда столько классов и методов.
Есть по легче сборка с открытыми исходами?
Еще так пишут пахабно...
Вот, что то тут тоже видимо.
PHP код: <?php
private LoginController() throws GeneralSecurityException
{
Util.printSection("LoginController");
_hackProtection = new FastMap<InetAddress, FailedLoginAttempt>();
_keyPairs = new ScrambledKeyPair[10];
KeyPairGenerator keygen = null;
keygen = KeyPairGenerator.getInstance("RSA");
RSAKeyGenParameterSpec spec = new RSAKeyGenParameterSpec(1024, RSAKeyGenParameterSpec.F4);
keygen.initialize(spec);
//generate the initial set of keys
for(int i = 0; i < 10; i++)
{
_keyPairs[i] = new ScrambledKeyPair(keygen.generateKeyPair());
}
_log.info("Cached 10 KeyPairs for RSA communication");
testCipher((RSAPrivateKey) _keyPairs[0]._pair.getPrivate());
// Store keys for blowfish communication
generateBlowFishKeys();
spec = null;
keygen = null;
new ConnectionChecker().start();
}
Запутанно все...
Серьезно, есть ли полегче сборки?
|