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