4

我创建了一个处理 PLAIN 加密节的模拟 XMPP 服务器。我可以使用 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(...)

我的问题是,这种模式行得通吗?如果没有,我是否应该考虑将收到的消息推入队列并简单地处理来自定时器的队列?

4

1 回答 1

2

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

现在像梦一样工作!

于 2012-05-18T16:21:40.323 回答