无法将 agsXmpp 客户端连接到 eJabberd 服务器

Posted

技术标签:

【中文标题】无法将 agsXmpp 客户端连接到 eJabberd 服务器【英文标题】:Not able to connect agsXmpp client to eJabberd server 【发布时间】:2014-08-27 14:49:29 【问题描述】:

我使用的是 Visual Studio 2010,操作系统是 Windows 7,64 位。我正在从事的项目需要 XMPP 功能;为此,我正在使用 agsXMPP 库。项目类型是 WPF 客户端,它会在我的 xmpp 代码运行时弹出一个窗口。

我在进行开发的同一 Windows 系统上运行 eJabberd 2.1.3 服务器。我还在 eJabberd 服务器上创建了多个帐户(如“aaa@mydomain”、“bbb@mydomain”等)并将它们“加为好友”。

为了测试与我的客户端的连接性,我在 Windows 上使用 Pandion Jabber 客户端,在同一网络上的 android 上使用 Xabber 客户端。设置工作正常,Xabber 和 Pandion 客户端能够相互交换消息。为了确保没有干扰,我暂时禁用了防火墙。

问题:我无法将我的程序连接到 eJabberd 服务器。弹出窗口时,其他客户端上不会显示存在。我正在使用以下代码:

    string uname = "aaa", domain_server = "mydomain", resource = "res1", password = "password";

    Jid jid = new Jid (uname, domain_server, resource);

    XmppClientConnection _xmppConn = new XmppClientConnection (jid.Server);

    // This is my development machine's IP address
    _xmppConn.ConnectServer = "192.168.0.101";

    _xmppConn.Server = domain_server;

    _xmppConn.Open (jid.User, password);

    // The event handlers:
    _xmppConn.OnLogin += new ObjectHandler (_xmppConn_OnLogin);
    _xmppConn.OnMessage += new agsXMPP.protocol.client.MessageHandler (_xmppConn_OnMessage);

    void _xmppConn_OnMessage (object sender, agsXMPP.protocol.client.Message msg) 
        MessageBox.Show (msg.Body);
    

    void _xmppConn_OnLogin (object sender) 
        MessageBox.Show ("Logged in");
    

当我从另一个 FB 帐户向该帐户发送消息时,相同的代码在 Facebook 聊天中运行良好。

    string uname = "<my fb name>", domain_server = "facebook.com", resource = "res1", password = "<my password>";

    Jid jid = new Jid (uname, domain_server, resource);

    XmppClientConnection _xmppConn = new XmppClientConnection (jid.Server);

    _xmppConn.Server = "chat.facebook.com";

    _xmppConn.Open (jid.User, password);

    // The event handlers:
    _xmppConn.OnLogin += new ObjectHandler (_xmppConn_OnLogin);
    _xmppConn.OnMessage += new agsXMPP.protocol.client.MessageHandler (_xmppConn_OnMessage);

    void _xmppConn_OnMessage (object sender, agsXMPP.protocol.client.Message msg) 
        MessageBox.Show (msg.Body);
    

    void _xmppConn_OnLogin (object sender) 
        MessageBox.Show ("Logged in");
    

我一直在绞尽脑汁,但就是不知道哪里出了问题。有人可以帮忙吗?先感谢您。 :)

【问题讨论】:

我对agsxmpp不太了解,但也许你需要在登录后手动发送出席信息? @legoscia,我尝试添加这一行:_xmppConn.AutoPresence = true;在代码中。也不要去那里。 telnet 192.168.0.101 5222 工作吗? @vitalyster,刚刚在下面添加了我的答案。这是一个主机解析问题。 【参考方案1】:

在您禁用自动 SRV 解析之前,ConnectServer 属性将被忽略

xmppCon.AutoResolveConnectServer = false;

这应该可以解决您的问题。

【讨论】:

我希望我能说你的解决方案比我的好,因为我觉得修改代码而不是适应环境总是有意义的。我试过这个(我之前也做过),但不幸的是它不起作用。 :( 无论如何感谢您的回复。【参考方案2】:

我认为——基于一些非常简单的测试——ConnectServer 需要一个主机名,如果你给它一个 IP 地址就会抛出一个错误。

【讨论】:

【参考方案3】:

我想我明白了。由于我在使用“自定义”域的开发系统上工作,即 mydomain,而不是通过公共 DNS 解析的知名 TLD,因此我必须在 hosts 文件中添加一个条目位于此处:

C:\Windows\System32\drivers\etc\hosts

添加了以下条目(假设 192.168.0.101 作为您的开发系统的 IP 地址):

192.168.0.101 我的域名

并注释掉或删除代码中的这一行:

_xmppConn.ConnectServer = "192.168.0.101";

这将使库能够将“mydomain”的地址找出到您本地开发机器上上述 hosts 文件中指定的 IP 地址。

编辑:还要确保在系统上禁用 IPV6。看到这个帖子:http://forum.ag-software.net/thread/682-agsXMPP-SDK-1-0-samples-How-to-call-server-on-loc

关于如何禁用 IPV6 的说明:http://www.techunboxed.com/2014/10/how-to-disable-ipv6-in-windows-10.html

【讨论】:

以上是关于无法将 agsXmpp 客户端连接到 eJabberd 服务器的主要内容,如果未能解决你的问题,请参考以下文章

aSmack 4.0.* XMPPTCPConnection 无法连接到 OpenFire 和 Ejabbered (SmackException$NoResponseException)

如何在 agsXMPP 上设置代理

无法打开 ejabbered Web 仪表板 localhost:5280

使用 agsxmpp 登录 XMPP

agsxmpp 事件顺序

在 c# 中使用 SASL ANONYMOUS 连接到 XMPP 服务器