2

我在寻找 C# xmpp 库方面的挣扎仍在继续,因为我现在被迫排除同时使用 Soapbox Studio SDK 和 aggXmpp / Matrix SDK。我已经转移到Jabber-net,这是为数不多的可用 C# 库之一,但至今无法连接到我的 Openfire 服务器。据我了解,这个库就像我迄今为止使用的大多数 xmpp 库一样异步执行,所以我首先调用 JabberClients 的“连接方法”并将登录到服务器的方法绑定到 JabberClient 的 OnConnect 处理程序。

下面是连接到 xmpp 服务器并将 jabberClient 的 OnConnect 处理程序绑定到 Logon 方法的 Connect 方法。

public string Connect()
{
        try
        {
            jabberClient = new JabberClient();
            jabberClient.Connect();
            jabberClient.OnConnect += (o, e) => Logon();                
            jabberClient.OnAuthError += (o, e) => ThrowError("authError");
            jabberClient.OnStreamError += (o, e) => ThrowError("streamError");

            return "Connection Succesful";
        }
        catch (Exception ex)
        {
            _logger.LogError("SessionManager", "Connect", "Could not connect to Openfire Server", ex.ToString());
            return "Could not Connect to Openfire Server: " + ex;
        }
}

这会产生以下找到的输出 SRV:denjab2.jabber.com:5222,但这会在到达 jabberClinet 的 Connect 方法时引发类型为“System.FormatException”的第一个更改异常。然后它输出“ExecuteConnect”

下面是登录方法

private void Logon()
{
        JID jid = new JID(OPENFIRE_USER_NAME, OPENFIRE_SERVER, "protoTest");
        jabberClient.User = jid.User;
        jabberClient.Server = jid.Server;
        jabberClient.Password = OPENFIRE_PASSWORD;
        jabberClient.AutoLogin = true;
        jabberClient.AutoPresence = true;
        jabberClient.Login();  
}

此方法不引发异常。

此外,JabberClient 的 onStreamError 处理程序被调用并简单地产生读取“发生流错误”的异常并且不提供内部异常。

我曾尝试在网络上和通过产品文档研究这些错误,但似乎没有建立与服务器连接的指南。我必须假设我错过了一个步骤,没有提供所有必要的凭据,或者只是执行了以错误顺序登录服务器所需的步骤。

在查看了 Joe Hildebrand 的回答中提到的示例应用程序后,我修改了我的“连接”方法,如下所示。

public void Connect()
{
        try
        {
            jabberClient = new JabberClient();              

            //Bind the JabberClient events to methods that handle those events.
            jabberClient.OnAuthError += (o, e) => ThrowError(ErrorType.AuthError);
            jabberClient.OnStreamError += (o, e) => ThrowError(ErrorType.StreamError);
            jabberClient.OnError += (o, e) => ThrowError(ErrorType.UnknownError);
            jabberClient.OnConnect += (o, e) => ConnectionComplete();

            //Set client settings
            jabberClient.AutoReconnect = 3f;

            JID jid = new JID(OPENFIRE_USER_NAME, OPENFIRE_SERVER, "gec2o");
            jabberClient.User = jid.User;
            jabberClient.Server = jid.Server;
            jabberClient.NetworkHost = null;
            jabberClient.Port = OPENFIRE_NOT_ENCRYPTED_PORT;
            jabberClient.Resource = jid.Resource;
            jabberClient.Password = OPENFIRE_PASSWORD;
            jabberClient.AutoStartTLS = false;
            jabberClient.AutoPresence = false;

            CapsManager cm = new CapsManager();
            cm.Stream = jabberClient;


            jabberClient.Connect();

        }
        catch (Exception ex)
        {
            _log.LogError("ConnectionManager", "Connect", "Could not connect to Openfire Server", ex.ToString());
            throw ex;
    }
}

但是,这似乎导致了相同的行为,控制台中显示了额外的错误,指出“Sock errno:10061”,并抛出一个异常,指出“由于目标机器主动拒绝它,无法建立连接”,这表明出于某种原因,openfire 服务器被拒绝了我的连接请求。我在 Jabber-net Google Group 上发现了这个主题,该主题建议我使用服务器的 IP 地址而不是服务器名称,因为该错误可能与无法解决 IPv4 与 IPv6 问题有关。

使用完整的 IP 地址消除了“目标机主动拒绝”错误,但出现了以下错误

 SEND: <iq id="JN_1" type="set" to="192.168.1.182"><bind 
xmlns="urn:ietf:params:xml:ns:xmpp-bind"><resource>rsup</resource></ 
bind></iq> 
RECV: <iq type="error" id="JN_1" from="192.168.1.182" to="infotel/ 
bf18b431"><bind xmlns="urn:ietf:params:xml:ns:xmpp- 
bind"><resource>rsup</resource></bind><error code="400" 
type="modify"><bad-request xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"/ 
></error></iq> 

ERROR: jabber.connection.sasl.AuthenticationFailedException: Error 
binding resource: <error code="400" type="modify" 
xmlns="jabber:client"><bad-request xmlns="urn:ietf:params:xml:ns:xmpp- 
stanzas" /></error> 

这个错误在 Jabber-net Google Group 的这个线程上被提及但没有完全解决

通过将 AutoStartTLS 设置为 true 并为 OnInvalidCertifcate 创建事件处理程序并将其绑定到 jabber 客户端,我能够根据 Joe Hildebrand 的评论摆脱这个错误。

这是修改后的“连接”方法

public void Connect()
{
        try
        {
            jabberClient = new JabberClient();

            //Bind the JabberClient events to methods that handle those events.
            jabberClient.OnAuthError += (o, e) => ThrowError(ErrorType.AuthError);
            jabberClient.OnStreamError += (o, e) => ThrowError(ErrorType.StreamError);
            jabberClient.OnError += (o, e) => ThrowError(ErrorType.UnknownError);
            jabberClient.OnConnect += (o, e) => ConnectionComplete();
            jabberClient.OnInvalidCertificate += new System.Net.Security.RemoteCertificateValidationCallback(OnInvalidCertificate);

            //Set client settings
            jabberClient.AutoReconnect = 3f;

            JID jid = new JID(OPENFIRE_USER_NAME, OPENFIRE_SERVER, "gec2o");
            jabberClient.User = jid.User;
            //jabberClient.Server = jid.Server;
            jabberClient.Server = "192.168.97.26";

            jabberClient.NetworkHost = null;
            jabberClient.Port = OPENFIRE_NOT_ENCRYPTED_PORT;
            jabberClient.Resource = jid.Resource;
            jabberClient.Password = OPENFIRE_PASSWORD;
            jabberClient.AutoStartTLS = true;
            jabberClient.AutoPresence = false;

            CapsManager cm = new CapsManager();
            cm.Stream = jabberClient;


            jabberClient.Connect();

}

这是 OnInvalidCertifcate 事件处理程序

bool OnInvalidCertificate(object sender, System.Security.Cryptography.X509Certificates.X509Certificate certificate, System.Security.Cryptography.X509Certificates.X509Chain chain, System.Net.Security.SslPolicyErrors sslPolicyErrors)
{
        Console.WriteLine("Invalid certificate ({0}):\n{1}", sslPolicyErrors.ToString(), certificate.ToString(true));
        return true;
}

这会导致以下异常。

Error binding resource 
<error type="modify" code="400"><bad-requestmlns="urn:ietf:params:xml:ns:xmpp-stanzas" /></error>

我还应该注意 jabber-net 示例控制台应用程序也不适合我。

这是我尝试运行应用程序时的命令行输入。

ConsoleClient.exe /j 800802@palburtus/gec2o /r 800802 /p 800802 /o 5222 /t true /n null

这是我收到的输出

  Connecting
Connected
ERROR: System.Net.Sockets.SocketException: No connection could be made because the target machine actively refused it at System.Net.Sockets.Socket.EndConnect(IAsyncResult asy
   at bedrock.net.AsyncSocket.ExecuteConnect(IAsyncResult a
.0.710\bedrock\net\AsyncSocket.cs:line 782

希望有人可以帮助解释我做错了什么。

4

5 回答 5

1

您是否尝试过ExampleConsoleClient应用程序?

您在Connect()完全配置 JabberClient 实例之前调用。首先设置所有属性和回调,然后调用Connect(). Login()最后,除非AutoLogin被解雇,False否则你几乎不应该打电话。OnAuthError

于 2011-06-16T06:48:22.523 回答
1

我有完全相同的问题。我终于意识到我IP为我的网络主机使用了错误的地址(我使用的是localhost, 而不是我的实际IP地址)。我知道这不是您的确切问题,但现在我可以运行JabberNet并连接到我的本地OpenFire服务器。这是我所拥有的:

Basic tab::
User: tony
Password: tony
Server: Server-Name (from the OpenFire Admin Console: / Server / Server Management page)

Network::
Port: 5222
Network Host: My IP Address

如果我从运行JabberNet示例应用程序Visual Studio 2010

AutoLogin = true,
Resource = Jabber.Net

我只需单击Allow Once(不可避免的)Invalid Certificate对话框。

其他一切都是默认的。

我不知道这是否有帮助,但它(最终)对我有用。

于 2012-08-28T18:16:32.033 回答
0

我在尝试连接到 Openfire 时也遇到了同样的错误。但是,我设法通过连接端口 5223 来消除错误,该端口是 Openfire 的“用于客户端使用旧 SSL 方法连接到服务器的端口”的端口。

于 2011-06-18T18:33:49.753 回答
0

您的服务器有 IPv6 地址吗?目前这并没有真正起作用。

于 2011-06-21T04:53:25.580 回答
0

为了使用 IP 地址而不是 DNS 进行连接,需要设置许多参数:

  1. NetworkHost - 也就是服务器 IP(或主机名,如果您配置了 DNS 或 /etc/host 文件)
  2. 服务器 - 又名 XMPP 服务器名称/域(通常与服务器的主机名相同)
jabberClient = new JabberClient();
jabberClient.NetworkHost = "192.168.0.2";
jabberClient.Server = "xmppservername.domain.etc";

如果jabberClient.Server已设置jabberClient.NetworkHost且未设置,jabber-net 将自动假定NetworkHostServer.

于 2012-05-03T01:21:54.900 回答