0

UWP アプリ用に C# で XMPP クライアントをビルドする必要があります。

いくつかのライブラリ .NET があることは知っていますが、うまく機能しないようです (無料のもの)。そのため、独自に実装することにしました。

サーバー側は ejabberd サービスです。

私はこの方法で StreamSocket を使用します (ref XMPP 3920bis ):

            StreamSocket socket = new StreamSocket();

            await socket.ConnectAsync(new HostName("my.server.com"), "5222", SocketProtectionLevel.PlainSocket);

            DataWriter dw = new DataWriter(socket.OutputStream);
            DataReader dr = new DataReader(socket.InputStream);
            dr.InputStreamOptions = InputStreamOptions.Partial;

            // Open stream
            await XmppWrite("<?xml version='1.0'?><stream:stream to='my.server.com' xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams' version='1.0'>", dw);
            var resp = await XmppRead(dr);

            // Auth
            var sasl = Base64Encode('\0' + SaslPrep("username") + '\0' + SaslPrep("password"));
            await XmppWrite("<auth xmlns='urn:ietf:params:xml:ns:xmpp-sasl' mechanism='PLAIN'>" + sasl + "</auth>", dw);
            resp = await XmppRead(dr);

            // Request bind
            await XmppWrite("<?xml version='1.0'?><stream:stream to='my.server.com' xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams' version='1.0'>", dw);
            resp = await XmppRead(dr);

            // Resource binding
            await XmppWrite("<iq id='"+ObtainID()+"' type='set'><bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'/></iq>", dw);
            resp = await XmppRead(dr);

            // Send initial presence
            await XmppWrite("<presence/>", dw);
            resp = await XmppRead(dr);

最初のプレゼンスを送信し、サーバーが応答せず、接続が閉じられるまで、すべてが正常に機能します。

何か案は?

4

1 に答える 1

0

問題は、リソース バインディングの後の「セッションを開く」というステップの欠落にありました。

// Resource binding
await XmppWrite("<iq id='"+ObtainID()+"' type='set'><bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'/></iq>", dw);
resp = await XmppRead(dr);

// Open session
await XmppWrite("<iq id='" + Guid.NewGuid() + "' type='set'><session xmlns='urn:ietf:params:xml:ns:xmpp-session'/></iq>", dw);
resp = await XmppRead(dr);

// Send initial presence
await XmppWrite("<presence/>", dw);
resp = await XmppRead(dr);
于 2015-12-12T09:10:03.177 に答える