08-10-2013, 01:58 PM
Всем привет. Изучаю механизм netty. И вот возник не большой вопрос. Надеюсь вы поможете мне. Итак поехали.
ЧТо я делаю? Создаю обычный сервер, который слушает строку. Если она есть то он выводит ее.
Реализация
Значит рассказываю историю. Пишу к серверу клиентский сендер
Посылаю строки. Ок. Сервер принимает их и выводит на экран. Грубо говоря срабатывает переопределенный метод messageReceived.
Теперь дальше. Запускаю игру. Конекчусь на сервер в надежде получить ТО что отсылает игра серверу. Не важно поток байтов или что. Просто получить и прочитать так сказать.
Что происходит:
Сервер говорит что есть конект. Следовательно в хэндлере срабатывает channelConnected. Ок.. Казалось бы все хорошо, но сервер не пишет мне то что он получил от игры. Отсюда вывод. Не сработал метод messageReceived.
+ я перестраховался. Просто сделал вывод в консоль сообщения если метод сработал. - Не сработал.
Я немного подумал над тем почему и что так. Перечитав код несколько раз подозрительно оказалось в пайплайне
А именно
pipeline.addLast("decoder", new StringDecoder());
Еще точнее StringDecoder()
Что это вабще такое? - Это стандартный строковый декодер. И как я понимаю для пакетов существует отдельный декодер.
Возвращаемся к вопросу почему же сервер ничего не вывел? - Наверно потому что декодер ничего не смог получить из канала поэтому не сработал метод на сообщение... Может быть я не прав.... А вабще это попахивает еще тем, что если не добавить к своей строке \0(конец сообщения) тогда эффект будет тот же самый.
Как я понимаю - мне надо менять декодер. Уважаемые форумчане. Прошу вашей помощи. Если не затруднит то с демонстрацией кода. Большое спасибо.
ЧТо я делаю? Создаю обычный сервер, который слушает строку. Если она есть то он выводит ее.
Реализация
Значит рассказываю историю. Пишу к серверу клиентский сендер
Код:
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(конец сообщения) тогда эффект будет тот же самый.
Как я понимаю - мне надо менять декодер. Уважаемые форумчане. Прошу вашей помощи. Если не затруднит то с демонстрацией кода. Большое спасибо.