【问题标题】:C# XMPP with StremSocket hangs after resource binding资源绑定后,带有 StremSocket 的 C# XMPP 挂起
【发布时间】:2015-12-08 21:23:55
【问题描述】:

我需要用 C# 为 UWP 应用构建 XMPP 客户端。

我知道有一些库 .NET,但似乎效果不太好(那些免费的),所以我决定自己实现它。

服务器端是一个 ejabberd 服务。

我以这种方式使用 StreamSocket(参考 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);

一切正常,直到我发送初始状态,服务器没有响应并且连接关闭。

有什么想法吗?

【问题讨论】:

    标签: c# xmpp win-universal-app stream-socket-client


    【解决方案1】:

    问题在于资源绑定后缺少步骤“打开会话”。

    // 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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-29
      相关资源
      最近更新 更多