Ложный XMPP-сервер с Миной работает только часть времени
Я создал фиктивный сервер XMPP, который обрабатывает строфы шифрования PLAIN. Я могу использовать Pidgin и пройти весь процесс создания сеанса до того момента, когда Pidgin думает, что пользователь находится на самом деле XMPP-сервере и отправляет регулярные пинги.
Однако, похоже, что не все сообщения обрабатываются правильно, и когда я получаю успешный вход в систему, это была просто удача. Я говорю, может быть, 1/10 времени, когда я действительно подключен. В других случаях кажется, что Пиджин пропустил сообщение или я быстро выбросил сообщения на транспорт.
Если я включаю плагин XMPP Console от Pidgin, первое соединение ВСЕГДА успешно, но второму пользователю не удается установить соединение, обычно он умирает, когда Pidgin запрашивает Обнаружение службы.
Мой код Mina выглядит примерно так:
try
{
int PORT = 20600;
IoAcceptor acceptor = null;
acceptor = new NioSocketAcceptor();
acceptor.getFilterChain().addFirst("codec", new ProtocolCodecFilter( new ProtocolCodecFactoryImpl()));
acceptor.getFilterChain().addLast("executor", new ExecutorFilter(IoEventType.MESSAGE_RECEIVED));
acceptor.setHandler( new SimpleServerHandler());
acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10);
acceptor.bind( new InetSocketAddress(PORT));
}
catch (Exception ex)
{
System.out.println(ex.getMessage());
}
и SimpleServerHandler
отвечает за обработку сообщений / строф и создание сеансов. messageReceived
функция выглядит так:
@Override
public void messageReceived(IoSession session, Object msg) throws Exception
{
String str = msg.toString();
System.out.println("MESSAGE: " + str);
process(session, str);
}
и наконец, процесс отвечает за разбор сообщения и написание ответа. Я использую sychonized на моей записи:
public void sessionWrite(IoSession session, String buf)
{
synchronized(session)
{
WriteFuture future = session.write(buf);
}
}
Для краткости я опустил код обработки, но он просто ищет определенные фрагменты данных, создает ответ и вызывает sessionWrite(...)
Мой вопрос, будет ли работать этот шаблон? И если нет, то должен ли я отправлять полученные сообщения в очередь и просто обрабатывать очередь, скажем, по таймеру?
1 ответ
Оказывается, Пиджин послал бы две строфы IQ, но я не справился с ними правильно. Мой декодер теперь определяет конец раздела и записывает только раздел в буфер, из которого я читаю.
Работает как мечта сейчас!