2011-10-12 40 views
4


我正在开发一个类似ichat的P2P即时通讯工具,但只是局域网。
我使用jmdns库进行服务发现,并使用pidgin进行测试并以Bonjour用户身份登录。到目前为止,服务_presence._tcp.local。
然后我们知道LAN中的用户信息如name @ host:port,那么如何与Bonjour客户端进行对话?
我看着XMPP,但它不支持P2P,但我很难找到支持P2P的扩展jingle的库。
也许我应该使用SIP进行对话?但数据包格式与Bonjour兼容?或者我必须研究数据包交换的结构?
任何人都可以解释一下关于ichat如何为LAN工作?
非常感谢你的帮助!
如何与bonjour客户端开始对话,了解其名称@host:port?

回答

4

我觉得你有点困惑。

Bonjour是一种查找服务的机制。它不是用于与服务进行通信。一旦你找到了@ host:port的信息,你就完成了Bonjour。

下一步将要求您谈谈服务能够理解的协议。服务字符串中的令牌_presence指示这是一个XMPP服务。您需要与XMPP进行交谈。你不能和SIP通话。你有没有尝试打开一个XMPP连接到你找到的主机和端口?

你说说SIP和Jingle。这些用于设置音频或视频通话。如果您正在编写即时消息程序,则无需执行此操作。仅XMPP就足够了。

如果你确实想支持音频或视频,那么你将需要这些协议之一。由于您找到的服务是XMPP服务,因此您需要使用Jingle。如果你没有可以说丁当的图书馆,你将不得不自己写代码。 Bonjour信息中没有标识SIP服务的信息,因此您不能使用SIP - 除非您可以制作不同的Bonjour查询并找到SIP服务。

我推断您正在使用Java。用于Java的最流行的XMPP库似乎是Smack

+0

你说打开一个XMPP连接,是的,这是问题困扰我!怎么样 ?与套接字连接或任何适合的库,这使我不关心数据包的格式?谢谢您的回答! – seaguest

+0

哦,对。我已经添加了一个名为Smack的图书馆的链接,它可以帮助你。 –

+1

谢谢,但实际上我已经看着sma,,我知道我们可以在服务器的帮助下开始与他人的对话。但是现在我没有服务器,它是p2p,所以可以在没有服务器的情况下完成这项工作? – seaguest

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将其与显示名称一起发布。该应用程序还浏览局域网上的对等方的MDNS:例如_sipuri._udp。一旦你得到了一些URI,你就可以使用SIP拨号。

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库,所以我必须通过套接字在xml流上工作。