Netty StartUp - Форум администраторов игровых серверов
Форум администраторов игровых серверов StormWall - Защита от DDos атак
Регистрация Мнения Справка Сообщество Календарь
Вернуться   Форум администраторов игровых серверов > Полезное / Common > Программирование / Programming > Java

Java В данном форуме вы сможете найти много полезной информации по платформе Java. Подробные статьи, исходные коды и конечно учебники как для новичков так и профессиональных Java разработчиков вы найдёте здесь. Если у вас есть вопрос или хотите поделится своими наработками, пожалуйста, делайте это в этой теме.

Ответ
Опции темы
Непрочитано 10.08.2013, 13:58   #1
Аватар для grizly
Пользователь

Автор темы (Топик Стартер) Netty StartUp

Всем привет. Изучаю механизм netty. И вот возник не большой вопрос. Надеюсь вы поможете мне. Итак поехали.

ЧТо я делаю? Создаю обычный сервер, который слушает строку. Если она есть то он выводит ее.

Реализация

Main:
Свернуть ↑Развернуть ↓


Pipeline:
Свернуть ↑Развернуть ↓

Handler:
Свернуть ↑Развернуть ↓


Значит рассказываю историю. Пишу к серверу клиентский сендер

Код:
    public static void main(String[] args) throws UnknownHostException, IOException, InterruptedException {
        // TODO code application logic here
        Scanner console = new Scanner(System.in);
        Socket sock = new Socket("IP",3003);
PrintWriter writer = new PrintWriter(sock.getOutputStream());
while(true){
    System.out.println("Text: ");
    String s = console.nextLine();
    writer.println(s+"\0");
    writer.flush();
}

    }
}
Посылаю строки. Ок. Сервер принимает их и выводит на экран. Грубо говоря срабатывает переопределенный метод messageReceived.

Теперь дальше. Запускаю игру. Конекчусь на сервер в надежде получить ТО что отсылает игра серверу. Не важно поток байтов или что. Просто получить и прочитать так сказать.

Что происходит:
Сервер говорит что есть конект. Следовательно в хэндлере срабатывает channelConnected. Ок.. Казалось бы все хорошо, но сервер не пишет мне то что он получил от игры. Отсюда вывод. Не сработал метод messageReceived.
+ я перестраховался. Просто сделал вывод в консоль сообщения если метод сработал. - Не сработал.

Я немного подумал над тем почему и что так. Перечитав код несколько раз подозрительно оказалось в пайплайне

Код:
public class NettyServerPipeLineFactory implements ChannelPipelineFactory {
    @Override
 public ChannelPipeline getPipeline() throws Exception {

 ChannelPipeline pipeline = pipeline();

 pipeline.addLast("framer", new DelimiterBasedFrameDecoder(8192, Delimiters.nulDelimiter()));
 pipeline.addLast("decoder", new StringDecoder()); 
 pipeline.addLast("encoder", new StringEncoder());

 pipeline.addLast("handler", new NettyServerHandler()); 

 return pipeline;
 }
 }
А именно
pipeline.addLast("decoder", new StringDecoder());

Еще точнее StringDecoder()

Что это вабще такое? - Это стандартный строковый декодер. И как я понимаю для пакетов существует отдельный декодер.

Возвращаемся к вопросу почему же сервер ничего не вывел? - Наверно потому что декодер ничего не смог получить из канала поэтому не сработал метод на сообщение... Может быть я не прав.... А вабще это попахивает еще тем, что если не добавить к своей строке \0(конец сообщения) тогда эффект будет тот же самый.

Как я понимаю - мне надо менять декодер. Уважаемые форумчане. Прошу вашей помощи. Если не затруднит то с демонстрацией кода. Большое спасибо.
grizly вне форума Ответить с цитированием
Непрочитано 10.08.2013, 14:03   #2
Аватар для linliss
Герой

По умолчанию Re: Netty StartUp

https://github.com/Camelion/jts - глянь как тут сеть написана...
linliss вне форума Ответить с цитированием
Непрочитано 10.08.2013, 14:13   #3
Аватар для Visor

По умолчанию Re: Netty StartUp

Цитата:
Сообщение от linliss Посмотреть сообщение
https://github.com/Camelion/jts - глянь как тут сеть написана...
https://github.com/Camelion/jts/tree...common/network
А она работает?
__________________
L2Emu Enterprise Server
Visor вне форума Отправить сообщение для Visor с помощью ICQ Отправить сообщение для Visor с помощью Skype™ Ответить с цитированием
Непрочитано 10.08.2013, 14:25   #4
Аватар для grizly
Пользователь

Автор темы (Топик Стартер) Re: Netty StartUp

Как я понимаю, мне надо позаимствовать из проекта класс PacketDecoder и переписать у себя следущее

pipeline.addLast("decoder", new PacketDecoder());

В таком случае PacketDecoder просит реализацию еще многих вещей, а я бы хотел видеть решение своей проблемы. В данном случае решения своей проблемы я не вижу.

Добавлено через 1 час 36 минут
Рассказываю о результате. Вгляделся в проект пользователя linliss и понял следущее:

- Нужно менять кодек! Вот как я переписал кусок того злополучного кода:

Код:
 pipeline.addLast("decoder", new FrameDecoder() {

            @Override
            protected Object decode(ChannelHandlerContext chc, Channel chnl, ChannelBuffer cb) throws Exception {
               System.out.println("Try to decode");
               if (cb.readableBytes() < 2)
                 return null;

                cb.markReaderIndex();

        byte first = cb.readByte();
        byte second = cb.readByte();
               return first;
               
            }
        });
Теперь вместо StringDecoder я использую FrameDecoder. При попытке послать hello все работает хорошо. Срабатывает messageReceived и выводит содержмое. Итак.. послал hello, сервер отвечает следущее:

Цитата:
NettyServer: Listen to users NettyServerHandler:
Client connected from /IP:59961 (-209645230)
Try to decode
Bytes 104
Try to decode
Bytes 108
Метод opcode вернул результат byte first = cb.readByte();

Вопрос таков. Что это означает.

И еще проблема такого плана. Пытаюсб игрой сделать конект - сервер молчит. ничего не выводит, хотя байтики я ему послал(игрой).

Последний раз редактировалось grizly; 10.08.2013 в 16:02. Причина: Добавлено сообщение
grizly вне форума Ответить с цитированием
Непрочитано 10.08.2013, 16:27   #5
Аватар для JavaMan

По умолчанию Re: Netty StartUp

Попробуй так
Код:
            @Override
            protected Object decode(ChannelHandlerContext chc, Channel chnl, ChannelBuffer cb) throws Exception {
               System.out.println("ChannelBuffer content: " + cb.toString(new Charset("UTF-8")));
            }
И убери из пипелайна

pipeline.addLast("framer", new DelimiterBasedFrameDecoder(8192, Delimiters.nulDelimiter()));
JavaMan вне форума Ответить с цитированием
Непрочитано 10.08.2013, 16:32   #6
Аватар для KID
Пользователь

По умолчанию Re: Netty StartUp

какой игрой?
Почему вы уверены, что игра что-то отправила?
KID вне форума Отправить сообщение для KID с помощью Skype™ Ответить с цитированием
Непрочитано 10.08.2013, 16:44   #7
Аватар для grizly
Пользователь

Автор темы (Топик Стартер) Re: Netty StartUp

@Java-man

Сделал так:
Код:
       int first = cb.readByte();
        byte second = cb.readByte();
       
        System.out.println("ChannelBuffer content: " + cb.toString());
     
        
        
               return first+"-"+second;
Посылаю: 1234 Итог:

Цитата:
Client connected from /IP:60390 (-202326428)
Try to decode
ChannelBuffer content: BigEndianHeapChannelBuffer(ridx=2, widx=6, cap=6)
Bytes49-50
Try to decode
ChannelBuffer content: BigEndianHeapChannelBuffer(ridx=4, widx=6, cap=6)
Bytes51-52
Try to decode
ChannelBuffer content: BigEndianHeapChannelBuffer(ridx=6, widx=6, cap=6)
Bytes13-10
При конекте игрой сервер ничего не выдает.


@KID
Первое что было под рукой это аион.

Почему я уверен в посыле байтов игрой? - Наверно потому что вместо сервера на этом же порте тестил конект на живом логин-сервере от этой игры. Логин писал типа посыл идет.

+ Я снифером смотрел. Снифер регистрирует передачу данных.

Добавлено через 8 минут
Дабы исключить такую мелоч, которую подкинул KID публикую скрин снифера и лог сервера

Цитата:
NettyServerHandler:
Client connected from /10.3.20.240:61438 (-2135720860)



Добавлено через 1 час 37 минут
Если говорить точнее то когда я пытаюсь подключиться игрой то не срабатывает метод decode

Но что это дает.... пока не понятно.

Последний раз редактировалось grizly; 10.08.2013 в 18:21. Причина: Добавлено сообщение
grizly вне форума Ответить с цитированием
Непрочитано 10.08.2013, 20:34   #8

По умолчанию Re: Netty StartUp

Цитата:
Сообщение от Visor Посмотреть сообщение
Она работает

grizly,
Цитата:
Client connected from /IP:60390 (-202326428)
Try to decode
ChannelBuffer content: BigEndianHeapChannelBuffer(ridx=2, widx=6, cap=6)
Bytes49-50
Try to decode
ChannelBuffer content: BigEndianHeapChannelBuffer(ridx=4, widx=6, cap=6)
Bytes51-52
Try to decode
ChannelBuffer content: BigEndianHeapChannelBuffer(ridx=6, widx=6, cap=6)
Bytes13-10
отлично передал вашу строку. По таблице ASCII 49=1; 50=2; 51=3; 52=4; 13=CR; 10=LF;. Т.е. если вы передавали 1234 из консоли, у вас помимо цифр ещё передались символы возврата каретки и перевода строки
Camelion вне форума Отправить сообщение для Camelion с помощью ICQ Ответить с цитированием
Сказали спасибо:
Непрочитано 10.08.2013, 21:04   #9
Аватар для grizly
Пользователь

Автор темы (Топик Стартер) Re: Netty StartUp

Camelion

Пришлось все это дело систематизировать. В итоге при передаче 1234 сервер выводит

Цитата:
Try to decode
Byte = : 31
Try to decode
Byte = : 32
Try to decode
Byte = : 33
Try to decode
Byte = : 34
Try to decode
Byte = : D
Try to decode
Это очень сходится с фрагментом из снифера



Таким образом я уже точно знаю, что имею дело с байтами. Но вопрос по прежнему меня тревожит ибо ответить на него смогут только гейм девелоперы. Почему же когда я пытаюсь сделать конект с игры(игры уже разные пробовал) то сервер ничего не выводит. Точнее почему не запускается метод decode? В чем проблема? Может я использую не тот кодек?

PS А что символизирует
Цитата:
Try to decode
Byte = : 31
Try to decode
Byte = : 32
Try to decode
Byte = : 33
Try to decode
Byte = : 34
Try to decode
Byte = : D
Try to decode
Буква D ? И судя по всему после нее я могу еще вычитать А. О чем они говорят? (причем установлено, что при разных наборах D повторяется.)
grizly вне форума Ответить с цитированием
Непрочитано 10.08.2013, 21:16   #10

По умолчанию Re: Netty StartUp

grizly, может клиент ждет от вас первого пакета? Такое было, например, в lineage 2. При установлении соединения между клиентом и сервером, именно сервер посылал первый пакет. До тех пор, пока клиент не получит этот пакет, он не отправлял ничего в ответ(в вашем случае метод decode не вызывается). Попробуйте изучить протокол вашей игры, и узнать, какая сторона начинает "сетевое общение".

Во втором случае ничего не изменилось:
0D = 13 = CR
0A = 10 = LF
Camelion вне форума Отправить сообщение для Camelion с помощью ICQ Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
cron & php asura013 Операционные системы / Operating systems 2 14.02.2013 12:51
Netty DieorL2 Java 31 05.10.2012 20:43
Aion Lightning 2.0 - Сборка сервера Wolfas Серверная часть 142 23.11.2010 12:59
Netcore Source (Netty) n3k0nation Java 3 03.05.2010 19:10


© 2007–2024 «Форум администраторов игровых серверов»
Защита сайта от DDoS атак — StormWall
Работает на Булке неизвестной версии с переводом от zCarot
Текущее время: 12:14. Часовой пояс GMT +3.

Вверх