- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我仍在努力寻找 C# xmpp 库,因为我现在不得不排除同时使用 Soapbox Studio SDK 和 aggXmpp/Matrix SDK 的可能性。我已经转到Jabber-net为数不多的可用 C# 库之一,到目前为止无法连接到我的 Openfire 服务器。据我了解,这个库就像我迄今为止使用的大多数 xmpp 库一样异步执行,所以我首先调用 JabberClients 的“连接方法”并将登录到服务器的方法绑定(bind)到 JabberClient 的 OnConnect 处理程序。
下面是我的 Connect 方法,它连接到 xmpp 服务器并将 jabberClient 的 OnConnect 处理程序绑定(bind)到 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 found: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 的回答中提到的示例应用程序之后,我将“连接”方法修改为如下所示。
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 创建事件处理程序并将其绑定(bind)到 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
希望有人能帮助解释我做错了什么。
最佳答案
您尝试过 Example 吗?或 ConsoleClient申请?
您在完全配置 JabberClient 实例之前调用 Connect()
。首先设置所有属性和回调,然后调用 Connect()
。最后,您几乎不应该调用 Login()
,除非 AutoLogin
为 False
或 OnAuthError
已触发。
关于c# - 使用 Jabber-Net 连接到 Openfire 服务器时绑定(bind)资源时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6364942/
我有以下设置: 一台装有 CentOS 6 的服务器 XMPP 服务器(使用 ejabber) 浏览器客户端(使用 Candy-chat) 聊天正常,用户有权限等 我需要做的是在用户 X 想要的时候创
除了明显的人对人即时消息聊天之外,您还使用 Jabber 服务器的功能启用了哪些功能? 编辑:真正展示它的工作代码的链接特别有用 - 并且更有可能被投票。 最佳答案 XMPP/Jabber 有无限的用
我需要使用什么类型的流来通过 tcp 套接字向 jabber 写入连接请求消息。我正在写一个 xml 格式的字符串。它应该与默认套接字流或数据输出流一起使用,但事实并非如此。 最佳答案 使用Smack
目前我创建的聊天应用程序是 windows 应用程序 (c#)。我创建了在内部使用 XMPP 协议(protocol)和 openfire 服务器的 jabber net 帮助下的基本客户端版本。现在
我想知道如何集成 jabber 而不是使用我的 AJAX 轮询脚本。我偶然发现了以下内容:http://code.google.com/p/xmpphp/ 它让我可以访问 jabber 服务器,但没有
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 7年前关闭。 Improve this qu
我有一些带有 jabberd 服务器和两个连接到它的 IM 客户端的小型测试网络设置。我想尝试使用wireshark从发送方嗅探数据并分析正在发送的xml。 我只对“发送”文件的一方的“请求”感兴趣。
这有点奇怪。 我正在改进 Pidgin,尝试为 jabber 添加基于客户端证书的身份验证。我设置了一个 openfire 服务器(它支持基于客户端证书的身份验证),但我想确保我正确设置了它 - 用我
就目前情况而言,这个问题不太适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、民意调查或扩展讨论。如果您觉得这个问题可以改进并可能重新开放,visit
我想请求您提供有关如何使用 Google Talk Bot 来与我的服务器上的代码进行通信的帮助。 我已经从 code.google.com 下载了 Jabber-Net,但是那里的示例还不够....
我正在使用 Jabber-Net 制作简单的 XMPP 客户端。为了发送简单的消息,我使用了示例代码中的一种方式,即: jabber.protocol.client.Message msg = new
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 已关闭10 年前。 Improve
我正在使用以下代码连接到 xmpp 服务器(python + xmppy): c = xmpp.Client("localhost", debug=[]) c.connect(("127.0.
我正在尝试获取多用户聊天中昵称的 Jabber ID,但以下代码仅返回 null: class JabberMUCMessageListenerAdapter implements PacketLis
我刚开始阅读 Oreilly 的 XMPP 权威指南,对于 hello world,他们有这个脚本: def main(): bot = EchoBot("echobot@wonderland
我需要使用 python 设置一个 jabber bot,它将根据多个联系人的在线/离线可用性发送消息。 我一直在研究 pyxmpp 和 xmpppy,但找不到任何方法(至少没有直接的方法)来检查给定
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 9
我们正在使用 Openfire (Jabber) 为我们的 MMORPG 启用聊天和状态功能。在我们的服务器架构中,客户端只打开一个与游戏服务器的连接,并且在登录时,游戏服务器会为这个新客户端创建一个
(也在 ServerFault 上询问过,建议我也在这里发布) 当其他用户在线提交报告内容时,我们需要通过网络向不同用户(合规、生产)发送桌面警报。 目前我们正在使用 NET SEND,但这不能保证交
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,
我是一名优秀的程序员,十分优秀!