我正在开发一个类似ichat的P2P即时通讯工具,但只是局域网。
我使用jmdns库进行服务发现,并使用pidgin进行测试并以Bonjour用户身份登录。到目前为止,服务_presence._tcp.local。
然后我们知道LAN中的用户信息如name @ host:port,那么如何与Bonjour客户端进行对话?
我看着XMPP,但它不支持P2P,但我很难找到支持P2P的扩展jingle的库。
也许我应该使用SIP进行对话?但数据包格式与Bonjour兼容?或者我必须研究数据包交换的结构?
任何人都可以解释一下关于ichat如何为LAN工作?
非常感谢你的帮助!
如何与bonjour客户端开始对话,了解其名称@host:port?
回答
我觉得你有点困惑。
Bonjour是一种查找服务的机制。它不是用于与服务进行通信。一旦你找到了@ host:port的信息,你就完成了Bonjour。
下一步将要求您谈谈服务能够理解的协议。服务字符串中的令牌_presence
指示这是一个XMPP服务。您需要与XMPP进行交谈。你不能和SIP通话。你有没有尝试打开一个XMPP连接到你找到的主机和端口?
你说说SIP和Jingle。这些用于设置音频或视频通话。如果您正在编写即时消息程序,则无需执行此操作。仅XMPP就足够了。
如果你确实想支持音频或视频,那么你将需要这些协议之一。由于您找到的服务是XMPP服务,因此您需要使用Jingle。如果你没有可以说丁当的图书馆,你将不得不自己写代码。 Bonjour信息中没有标识SIP服务的信息,因此您不能使用SIP - 除非您可以制作不同的Bonjour查询并找到SIP服务。
我推断您正在使用Java。用于Java的最流行的XMPP库似乎是Smack。
您可以使用SIP。 MDNS将成为您的发现机制,然后您将使用普通的SIP进行呼叫,您可以学习您想要拨打的URI。
SIPSIMPLE SDK(http://sipsimpleclient.com)通过唱这个过期的草稿来实现这个功能:http://tools.ietf.org/html/draft-lee-sip-dns-sd-uri-03它可能是一个好的开始。
基本上你的客户端会生成一个类似于sip:random_stuff @ ip:port的URI,然后通过使用MDNS将其与显示名称一起发布。该应用程序还浏览局域网上的对等方的MDNS:例如_sipuri._udp。一旦你得到了一些URI,你就可以使用SIP拨号。
感谢大家的关注,现在我找到了一些东西。 XMPP不支持P2P模式,仅支持客户端服务器客户端。但是另一个标准“XEP-0174:无服务器消息传递”适用于本地网络中的P2P通信。 DNS-SD + XEP-0174,ichat以这种方式工作。
因为我使用了smack库,它不支持p2P;但有人做了一些更改,这里是链接 http://issues.igniterealtime.org/browse/SMACK-262。
我没有试过这个XMPPLLConnection,我查了一下smack的源代码,它是基于socket连接的。不幸的是,没有任何XEP-1074的Java库,所以我必须通过套接字在xml流上工作。
- 1. Bonjour IM客户端
- 2. 了解OAuth和客户端会话
- 3. WCF客户端类名称
- 4. 保存字符串与打开客户端/保存对话框
- 5. 如何在OpenERP7客户端打开目录对话框?
- 6. iChat如何开始对话?
- 7. 我的聊天客户端开始线程后冻结了
- 8. Fitness HISTORY_API - 如何为客户端连接设置帐户名称
- 9. 开始日光浴客户端
- 10. php创建一个文件夹,其名称以会话开始
- 11. 获取客户端计算机名称
- 12. 按客户端名称筛选推文
- 13. 客户端会话
- 14. JavaScript异常“调用的对象已与其客户端断开连接。”对window.open(...)
- 15. Mac客户端无法解析Windows家庭服务器名称
- 16. 如何在命名空间socket.io中将客户端与其他客户端连接起来?
- 17. 与客户端会话弹出窗口
- 18. 更改PrimeFaces对话是在客户端
- 19. 开始/结束与1000个客户端的socketasynceventargs
- 20. HTML5客户端应用程序打开文件对话框
- 21. 如何从头开始实施OpenID客户端?
- 22. 如何开始使用vSphere 6.0并设置Web客户端?
- 23. 了解跳过服务器与客户端流星
- 24. 富Web客户端与瘦客户端
- 25. Windows客户端与Web客户端
- 26. 如何让CXF客户端了解列表?
- 27. 如何确定服务器控件的客户端名称?
- 28. 如何知道客户端的URL名称?
- 29. 如何从JavaScript获取终端服务客户机名称?
- 30. 如何在libtorrent中设置客户端名称
你说打开一个XMPP连接,是的,这是问题困扰我!怎么样 ?与套接字连接或任何适合的库,这使我不关心数据包的格式?谢谢您的回答! – seaguest
哦,对。我已经添加了一个名为Smack的图书馆的链接,它可以帮助你。 –
谢谢,但实际上我已经看着sma,,我知道我们可以在服务器的帮助下开始与他人的对话。但是现在我没有服务器,它是p2p,所以可以在没有服务器的情况下完成这项工作? – seaguest