gpt4 book ai didi

java - 使用 Mina 模拟 XMPP 服务器仅在部分时间有效

转载 作者:行者123 更新时间:2023-12-02 04:37:29 25 4
gpt4 key购买 nike

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

但是,似乎并非所有消息都得到正确处理,当我成功登录时,这只是运气。我是说,也许是我实际连接的时间的 1/10。其他时候,似乎洋泾浜错过了一条消息,或者我把消息转储到了传输上。

如果我启用 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 负责消息/节处理和 session 创建。 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 节,但我没有正确处理它们。我的解码器现在确定节的结尾,并且只将节写入我从中读取的缓冲区。

现在就像做梦一样!

关于java - 使用 Mina 模拟 XMPP 服务器仅在部分时间有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10638950/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com