我正在开发一个 P2P 即时通讯器项目,例如 ichat,但仅适用于 LAN。
我使用 jmdns 库进行服务发现,并使用 pidgin 进行测试并以 Bonjour 用户身份登录。到目前为止,服务_presence._tcp.local。很好发现,
那么我们知道局域网中的用户信息,如name@host:port,那么如何与Bonjour客户端开始对话?
我查看了 XMPP,但它不支持 P2P,但我几乎找不到支持 P2P 的扩展 jingle 的库。
也许我应该使用 SIP 进行对话?但数据包格式与 Bonjour 兼容?或者我必须研究交换数据包的结构?
谁能解释一下 ichat 如何为 LAN 工作?
非常感谢您的帮助!<br>
3 回答
我觉得你有点困惑。
Bonjour 是一种寻找服务的机制。它不是用于与服务通信。找到 name@host:port 信息后,您就完成了 Bonjour。
下一步将要求您使用服务可以理解的协议。服务字符串中的标记_presence
表明这是一个 XMPP 服务。您将需要与 XMPP 交谈。您不能与它通话 SIP。您是否尝试过打开与您找到的主机和端口的 XMPP 连接?
你谈到了 SIP 和 Jingle。这些用于设置音频或视频通话。如果您正在编写即时消息程序,则不需要这样做。仅 XMPP 就足够了。
如果您确实想支持音频或视频,那么您将需要其中一种协议。因为您找到的服务是 XMPP 服务,所以您需要使用 Jingle。如果您没有会说 Jingle 的库,则必须自己编写代码。Bonjour 信息中没有任何内容可以识别 SIP 服务,因此您不能使用 SIP - 除非您可以进行不同的 Bonjour 查询并找到 SIP 服务。
我推断您正在使用 Java。Java 最流行的 XMPP 库似乎是Smack。
感谢大家的关注,现在我找到了一些东西。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 流。
您可以为此使用 SIP。MDNS 将成为您的发现机制,然后您将使用普通的 SIP 进行呼叫,您知道要拨打的 URI。
SIPSIMPLE SDK ( http://sipsimpleclient.com ) 通过唱这个过期的草案来实现这个功能:https://datatracker.ietf.org/doc/html/draft-lee-sip-dns-sd-uri-03它可能是一个好的开始。
基本上,您的客户端会生成一个类似 sip:random_stuff@ip:port 的 URI,然后使用 MDNS 将其与显示名称一起发布。该应用程序还浏览 MDNS 以查找 LAN 上的对等点:例如 _sipuri._udp。一旦你得到一些 URI,你就可以使用 SIP 拨号。