我创建了一个处理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(...)
我的问题是,这种模式会起作用吗?如果没有,我应该考虑在队列中推送收到的消息,只是从定时器处理队列吗?
答案 0 :(得分:1)
事实证明,Pidgin会发送两个IQ节,但我没有正确处理它们。我的解码器现在确定一个节的结束,并且只将一个节写入我读取的缓冲区。
现在就像梦一样!