4

PLAIN 暗号化スタンザを処理するモック XMPP サーバーを作成しました。私は Pidgin を使用して、ユーザーが実際に XMPP サーバー上にあり、通常の ping を送信していると Pidgin が判断するまで、セッション作成全体を行うことができます。

ただし、すべてのメッセージが正しく処理されているわけではないようで、ログインに成功したのは運が良かっただけです。私が話しているのは、おそらく実際に接続できる時間の 1/10 です。また、ピジンがメッセージを見逃したか、メッセージをダンプしてトランスポートを高速化したように見える場合もあります。

Pidgin の XMPP コンソール プラグインを有効にすると、最初の接続は常に成功しますが、2 番目のユーザーは接続に失敗し、通常は 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);

}

最後に、プロセスはメッセージの解析と応答の書き込みを担当します。私は自分の書き込みで同期化を使用します:

public void sessionWrite(IoSession session, String buf)
{
    synchronized(session)
    {
        WriteFuture future = session.write(buf);
    }
}

簡潔にするために処理コードは省略しましたが、特定のデータを探して応答を作成し、呼び出しを行うだけです。sessionWrite(...)

私の質問は、このパターンは機能しますか? そうでない場合は、受信したメッセージをキューに押し込み、単にタイマーからキューを処理することを検討する必要がありますか?

4

1 に答える 1

2

結局のところ、Pidgin は 2 つの IQ スタンザを送信しましたが、私はそれらを正しく処理していませんでした。私のデコーダーはスタンザの終わりを判断し、読み取り元のバッファーにのみスタンザを書き込みます。

今では夢のように動作します!

于 2012-05-18T16:21:40.323 に答える