无法将 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)