使用xmedianet库挂起“资源绑定”进程的XMPP连接

时间:2015-07-09 12:21:50

标签: c# data-binding windows-phone-8.1 xmpp

作为即时通讯领域的完全初学者(使用XMPP协议),以及Windows Phone 8.1 app开发;我试图通过使用xmedianet library开始,以便连接到服务器并使用XMPP协议进行通信。在实施以下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>

除了一些“线程退出”消息之外,其次是虚无,并且程序在几分钟后终止。

我已经使用了好几天..我已经尝试了所有可能的连接参数场景,甚至尝试摆弄图书馆的代码无济于事。任何人都可以尝试使用相同的库复制此配置,以查看它是否是我身边的问题?

注意:使用其他xmpp客户端与同一帐户连接到服务器的工作正常。

1 个答案:

答案 0 :(得分:0)

原来问题是,由于某种原因,即使绑定尝试返回成功结果,“绑定”状态也没有触发。我已经设法通过使用Thread.sleep()然后手动将状态更改为“绑定”来“修复”这种丑陋的方式(请注意,相同的技巧用于进入“会话”状态)。这是我的“拼凑”代码的示例:

 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; ...