XMPP (Xamarin.Android) 中的主机未知异常

Posted

技术标签:

【中文标题】XMPP (Xamarin.Android) 中的主机未知异常【英文标题】:Host-unknown exception in XMPP (Xamarin.Android) 【发布时间】:2015-09-25 10:46:29 【问题描述】:

我continue 连接到服务器。我已成功将XMPP library 添加到我的 Xamarin.android 项目中,但是当我尝试建立一个简单的连接时:

        using (var cl = new XmppClient(hostname,username,password))
        
            cl.Connect();

            Console.WriteLine("Contacts on " + cl.Jid.Node + "'s contact-list:");
            foreach (var item in cl.GetRoster())
                Console.WriteLine(" - " + item.Jid);
             

发生这种情况:

09-25 12:37:14.713 I/mono-stdout( 2821): _xmpp-client._tcp.jabbim.cz 2454 IN SRV 20 0 5222 lb2-hap.jabbim.cz
  |--- Name _xmpp-client._tcp.jabbim.cz
09-25 12:37:14.717 I/mono-stdout( 2821):   |--- Name _xmpp-client._tcp.jabbim.cz
  |--- Port: 5222
09-25 12:37:14.721 I/mono-stdout( 2821):   |--- Port: 5222
09-25 12:37:14.729 I/mono-stdout( 2821):   |--- Priority20
  |--- Priority20
09-25 12:37:14.741 I/mono-stdout( 2821):   |--- Type Srv
  |--- Type Srv
  |--- Target: lb2-hap.jabbim.cz
09-25 12:37:14.765 I/mono-stdout( 2821):   |--- Target: lb2-hap.jabbim.cz
_xmpp-client._tcp.jabbim.cz 2454 IN SRV 10 0 5222 lb1-hap.jabbim.cz
09-25 12:37:14.773 I/mono-stdout( 2821): _xmpp-client._tcp.jabbim.cz 2454 IN SRV 10 0 5222 lb1-hap.jabbim.cz
  |--- Name _xmpp-client._tcp.jabbim.cz
09-25 12:37:14.781 I/mono-stdout( 2821):   |--- Name _xmpp-client._tcp.jabbim.cz
  |--- Port: 5222
09-25 12:37:14.781 I/mono-stdout( 2821):   |--- Port: 5222
  |--- Priority10
09-25 12:37:14.785 I/mono-stdout( 2821):   |--- Priority10
09-25 12:37:14.789 I/mono-stdout( 2821):   |--- Type Srv
  |--- Type Srv
  |--- Target: lb1-hap.jabbim.cz
09-25 12:37:14.797 I/mono-stdout( 2821):   |--- Target: lb1-hap.jabbim.cz
09-25 12:37:15.457 D/Mono    ( 2821): Assembly Ref addref System.Xml[0xb7c5d400] -> System[0xb7c24320]: 7
09-25 12:37:16.033 D/Mono    ( 2821): DllImport attempting to load: '/system/lib/liblog.so'.
09-25 12:37:16.057 D/Mono    ( 2821): DllImport loaded library '/system/lib/liblog.so'.
09-25 12:37:16.057 D/Mono    ( 2821): DllImport searching in: '/system/lib/liblog.so' ('/system/lib/liblog.so').
09-25 12:37:16.057 D/Mono    ( 2821): Searching for '__android_log_print'.
09-25 12:37:16.065 D/Mono    ( 2821): Probing '__android_log_print'.
09-25 12:37:16.065 D/Mono    ( 2821): Found as '__android_log_print'.
09-25 12:37:16.085 I/MonoDroid( 2821): UNHANDLED EXCEPTION:
09-25 12:37:16.085 I/MonoDroid( 2821): Sharp.Xmpp.XmppDisconnectionException: Unrecoverable stream error: host-unknown
09-25 12:37:16.093 I/MonoDroid( 2821): at Sharp.Xmpp.Core.StreamParser.NextElement (string[]) <IL 0x0015d, 0x00713>
09-25 12:37:16.093 I/MonoDroid( 2821): at Sharp.Xmpp.Core.XmppCore.InitiateStream (string) <IL 0x000b5, 0x002eb>
09-25 12:37:16.093 I/MonoDroid( 2821): at Sharp.Xmpp.Core.XmppCore.SetupConnection (string) <IL 0x00007, 0x00053>
09-25 12:37:16.097 I/MonoDroid( 2821): at Sharp.Xmpp.Core.XmppCore.Connect (string) <IL 0x0004f, 0x001bf>
09-25 12:37:16.097 I/MonoDroid( 2821): at Sharp.Xmpp.Im.XmppIm.Connect (string) <IL 0x00078, 0x002b7>
09-25 12:37:16.101 I/MonoDroid( 2821): at Sharp.Xmpp.Client.XmppClient.Connect (string) <IL 0x00007, 0x00033>

配置中似乎缺少某些内容。 非常感谢您的回复。

【问题讨论】:

【参考方案1】:

根据this page的异常:

Sharp.Xmpp.XmppDisconnectionException: Unrecoverable stream error: host-unknown

指的是:

由初始实体提供的“to”属性的值 流标头与托管的主机名不对应 服务器。

所以您用于建立连接的主机名与服务器的主机名不匹配。那么您确定您使用的主机名是正确的并且服务器使用的正是这个主机名吗?

【讨论】:

我使用“jabbim.cz”作为主机名变量。我不得不提一下,这段代码在控制台应用程序中可以正常工作,所以问题可能出在 Android/Xamarin 中。 如果它在控制台中正常工作,则可能是 Android 无法连接到特定主机的防火墙/代理问题。您是否在清单中添加了所需的互联网权限? 是的,我已经添加了“android.permission.INTERNET”,我还需要添加什么吗?【参考方案2】:

这可能是 Android 或服务器配置中的 DNS 解析问题。 Sharp.Xmpp 使用https://arsofttoolsnet.codeplex.com/ 包。

$ nslookup -querytype=SRV _xmpp-client._tcp.jabbim.cz 服务器:100.72.64.140 地址:100.72.64.140#53

非权威回答: _xmpp-client._tcp.jabbim.cz 服务 = 10 0 5222 lb1-hap.jabbim.cz。 _xmpp-client._tcp.jabbim.cz 服务 = 20 0 5222 lb2-hap.jabbim.cz.

权威答案可以从以下位置找到: lb1-hap.jabbim.cz 互联网地址 = 88.86.102.58 lb2-hap.jabbim.cz 网络地址 = 37.157.196.214`

根据您的 sn-p,分辨率是正确的,并且您正在连接到 lb1-hap.jabbim.cz。会不会是你从控制台连接到 lb2,而 lb2、lb1 有不同的配置?

【讨论】:

【参考方案3】:

使用这个:

client = new XmppClient(hostname, username, password);
client.Hostname = hostname;
client.Connect();

原因似乎是 Sharp.Xmpp 中的一个错误。 在 XmppClient() 函数中,主机名被更改为 DNS 查找,在您的情况下为 lb1-hap.jabbim.cz

稍后在Connect() 函数中,第一个XML 节被发送到相同的主机名"to:lb1-hap.jabbim.cz"。然后服务器正确响应Unknown Host,因为它想要jabbim.cz

【讨论】:

以上是关于XMPP (Xamarin.Android) 中的主机未知异常的主要内容,如果未能解决你的问题,请参考以下文章

Xamarin 是不是支持 Xamarin Android 绑定库中的 Kotlin 协程?

Xamarin.Android 中的后台执行

有没有办法使用 Xamarin.Forms PCL 项目中的 Devexpress.Xamarin.Android.Charts

Xamarin.Android 中的错误局部变量类型不匹配

Visual Studio 2017 中的 Xamarin (Android) 单元测试

如何从xamarin表单应用程序中的PCL项目访问android原生布局文件?