我在寻找C#xmpp库方面的努力仍在继续,因为我现在已经强制要求使用Soapbox Studio SDK和aggXmpp / Matrix SDK。我已经转移到Jabber-net剩下的少数剩余C#库中的一个,因此我无法连接到我的Openfire服务器。据我所知,这个库就像我迄今为止使用的大多数xmpp库一样异步执行所以我首先调用JabberClients的Connect方法并将一个登录到服务器的方法绑定到JabberClient的OnConnect处理程序。
下面是我的Connect方法,它连接到xmpp服务器并将jabberClient的OnConnect处理程序绑定到Logon方法。
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处理程序并简单地处理一个异常,该异常读取“A Stream Error Occured”并且不提供内部异常。
我试图在网上和产品文档中研究这些错误,但似乎没有建立与服务器连接的指南。我必须假设我要么缺少一步,不提供所有必要的凭据,要么只是执行以错误的顺序登录服务器所需的步骤。
在查看Joe Hildebrand的回答中提到的示例应用程序之后,我将“Connect”方法修改为如下所示。
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服务器被拒绝我的连接请求。我发现This topic on the 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>
提及此错误但未在this thread of the Jabber-net Google Group
上完全解决我能够根据Joe Hildebrand将设置AutoStartTLS的注释设置为true并为OnInvalidCertifcate创建事件处理程序并将其绑定到jabber客户端来摆脱此错误。
以下是修订后的'Connect'方法
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
希望有人可以帮助解释我做错了什么。
答案 0 :(得分:1)
您是否尝试过Example或ConsoleClient申请?
在完全配置JabberClient实例之前,您正在调用Connect()
。首先设置所有属性和回调,然后调用Connect()
。最后,除非Login()
AutoLogin
或False
被解雇,否则您几乎不应致电OnAuthError
。
答案 1 :(得分: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
即可。
其他一切都是默认的。
我不知道这是否有帮助,但它(最终)对我有用。
答案 2 :(得分:0)
我在尝试连接到Openfire时也遇到了同样的错误。我设法摆脱了错误,但通过连接端口5223,这是Openfire的端口“用于客户端使用旧SSL方法连接到服务器的端口。”
答案 3 :(得分:0)
您的服务器是否有IPv6地址?那个目前还没有真正起作用。
答案 4 :(得分:0)
需要设置许多参数才能使用IP地址而不是DNS进行连接:
jabberClient = new JabberClient();
jabberClient.NetworkHost = "192.168.0.2";
jabberClient.Server = "xmppservername.domain.etc";
如果设置了jabberClient.Server
且jabberClient.NetworkHost
未设置,则jabber-net会自动认为NetworkHost
与Server
相同。