我正在开发一个P2P即时通讯项目,比如ichat,但仅适用于局域网
我使用jmdns库进行服务发现,并使用pidgin进行测试并以Bonjour用户身份登录。到目前为止,服务_presence._tcp.local。很有发现,
然后我们知道局域网中用户的信息,比如name @ host:port,那么如何与Bonjour客户端开始对话呢?
我查看了XMPP,但它不支持P2P,但我很难找到支持P2P的扩展jingle的库。
也许我应该使用SIP进行对话?但数据包格式与Bonjour兼容?或者我必须研究交换分组的结构?
任何人都可以解释一下ichat如何为LAN工作?
非常感谢您的帮助!
答案 0 :(得分:4)
我觉得你有点困惑。
Bonjour是一种查找服务的机制。它不适用于与服务通信。一旦找到名称@ host:port信息,您就完成了Bonjour。
下一步将要求您讨论服务理解的协议。服务字符串中的标记_presence
表示这是XMPP服务。你需要和它谈谈XMPP。你不能谈论SIP。您是否尝试打开与已找到的主机和端口的XMPP连接?
你谈论SIP和Jingle。这些用于设置音频或视频呼叫。如果您正在编写即时消息程序,则无需执行此操作。仅XMPP就足够了。
如果您确实想要支持音频或视频,那么您将需要其中一种协议。因为您找到的服务是XMPP服务,所以您需要使用Jingle。如果你没有可以说Jingle的库,你必须自己编写代码。 Bonjour信息中没有任何内容标识SIP服务,因此您无法使用SIP - 除非您可以进行不同的Bonjour查询并找到SIP服务。
我推断您使用的是Java。最受欢迎的Java XMPP库似乎是Smack。
答案 1 :(得分:2)
感谢大家的关注,现在我找到了一些东西。 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库,所以我必须在socket上处理xml流。
答案 2 :(得分:0)
您可以使用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将其与显示名称一起发布。该应用程序还为LAN上的对等方浏览MDNS:例如_sipuri._udp。获得一些URI后,您只需使用SIP拨号即可。