使用 xmedianet 库的 XMPP 连接挂在 "Resource Binding" 进程上

XMPP connection hanging on "Resource Binding" process using xmedianet library

作为即时通讯领域的完全初学者(使用 XMPP 协议),以及 windows phone 8.1 应用程序开发;我试图从使用 xmedianet library in order to connect to a server and communicate using XMPP protocol. After implementing the following example 开始并根据我的需要进行调整。 这是我配置连接参数的代码部分:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Navigation;
using Microsoft.Phone.Controls;
using Microsoft.Phone.Shell;
using WP8Xmpp.Resources;
using System.Net.XMPP;
using System.Net.Sockets;
using System.Threading;

namespace WP8Xmpp
{
public partial class MainPage : PhoneApplicationPage
{

    private Boolean IsXmppSuccess { get; set; }

     /// <summary>
    /// Xmpp Client
    /// </summary>
    public XMPPClient ObjXmppClient { get; set; }

    /// <summary>
    /// XMPP Connection 
    /// </summary>
    public XMPPConnection ObjXmppCon { get; set; }    

    // Constructor
    public MainPage()
    {
        InitializeComponent();

    }

    private void btnLogin_Click(object sender, RoutedEventArgs e)
    {
        IsXmppValid();
    }

    private void IsXmppValid()
    {
        ObjXmppClient = new XMPPClient();
        //initializing the xmpp client with credentials
        ObjXmppClient.JID = "user@domain.com";
        ObjXmppClient.JID.Resource = Guid.NewGuid().ToString(); 
        ObjXmppClient.Password = "acc_password";
        ObjXmppClient.Server = "server_uri";*/
        ObjXmppClient.AutoReconnect = true;
        ObjXmppClient.Port = 81; // I've already tried 5222 but 81 is the correct port in this server's case.
        ObjXmppClient.RetrieveRoster = true; 
        ObjXmppClient.PresenceStatus = new PresenceStatus() { PresenceType = PresenceType.available, IsOnline = true };
        ObjXmppClient.AutoAcceptPresenceSubscribe = true;
        ObjXmppClient.AttemptReconnectOnBadPing = true;
        ObjXmppCon = new XMPPConnection(ObjXmppClient);
        ObjXmppCon.Connect();
        ObjXmppClient.Connect();

        //initializing the xmpp connection

        ObjXmppCon.OnAsyncConnectFinished += ObjXmppCon_OnAsyncConnectFinished;


        ObjXmppClient.OnStateChanged += new EventHandler(xMPPClient_OnStateChanged);

        Thread.Sleep(2000);

    } ...

当我使用 WP 8.1 模拟器启动此应用程序并尝试连接时。在资源绑定步骤之前一切正常。我在 VS2013 控制台上得到以下输出:

<--stream:features><ver xmlns="urn:xmpp:features:rosterver"/><compression xmlns="http://jabber.org/features/compress"><method>zlib</method></compression><bind xmlns="urn:ietf:params:xml:ns:xmpp-bind"/><session xmlns="urn:ietf:params:xml:ns:xmpp-session"/></stream:features>
Setting state to CanBind
Setting state to Binding
<--<
<--iq id="xxxxxxxx-xxxx-xxxx-xxxx-0f08b82b9f1f" to="user@domain/Resource" xmlns="jabber:client" type="result"><bind xmlns="urn:ietf:params:xml:ns:xmpp-bind"><jid>user@domain/Resource</jid></bind></iq>

除了几条 "thread exit" 消息和程序在几分钟后终止外,什么都没有。

我已经搞了好几天了。我已经尝试了连接参数的所有可能方案,甚至尝试摆弄库的代码都无济于事。谁能尝试用同一个库复制这个配置,看看我这边是否有问题?

注意:使用同一帐户使用另一个 xmpp 客户端连接到服务器工作正常。

原来的问题是,由于某种原因,即使绑定尝试返回成功结果,"Bound" 状态也没有触发。我已经通过使用 Thread.sleep() 然后手动将状态更改为 "bound" 来 "fix" 这种丑陋的方式(请注意,使用相同的技巧来获得 "session" 状态)。这是我的 "patchwork" 代码示例:

 void xMPPClient_OnStateChanged(object sender, EventArgs e)
    {
        switch (ObjXmppClient.XMPPState)
        {
            case XMPPState.Binding:
                this.Dispatcher.BeginInvoke(() =>
                    {
                        Thread.Sleep(2000);
                        ObjXmppClient.XMPPState = System.Net.XMPP.XMPPState.Bound;
                    }    
                );
                break;
            case XMPPState.Sessioning:
                this.Dispatcher.BeginInvoke(() =>
                {
                    Thread.Sleep(2000);
                    ObjXmppClient.XMPPState = System.Net.XMPP.XMPPState.Session;
                }
                );
                break; ...