我创建了一个模拟XMPP服务器,用于处理PLAIN加密节。我能够使用Pidgin并完成整个会话的创建,直到Pidgin认为用户位于实际XMPP服务器上并正在发送常规ping。

但是,似乎并非所有消息都得到正确处理,当我成功登录后,真是倒霉。我在说,也许是我真正建立联系的时间的1/10。其他时候,似乎Pidgin错过了一条消息,或者我将消息转储到传输中以便快速传输。

如果启用了Pidgin的XMPP控制台插件,则第一个连接始终会成功,但是第二个用户将无法建立连接,通常会在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(...)
我的问题是,这种模式行得通吗?如果不是,我是否应该考虑将接收到的消息推入队列中,并简单地说一个计时器来处理队列?

最佳答案

事实证明,Pidgin会发送两个IQ节,但我没有正确处理它们。现在,我的解码器确定节的结尾,并且仅将节写入我读取的缓冲区中。

现在像梦一样工作!

07-25 21:00