我希望用Java实现一个简单的XMPP服务器。
我需要的是一个可以解析和理解来自客户端的xmpp请求的库。我看过Smack(下面提到)和JSO。 Smack似乎只是客户端,所以虽然它可能有助于解析数据包,但它不知道如何响应客户端。 JSO是否保持它看起来很旧。唯一有希望的途径是拆开Openfire,这是一个完整的商业(OSS)XMPP服务器。
我只是希望Netty或Mina上面有几行代码,所以我可以开始处理一些消息。
乔 -
我想要做的事情的答案有点长 - 我会尽量保持简短。
有两件事情只是松散相关:
1)我想编写一个XMPP服务器,因为我想为两个客户端编写自定义协议进行通信。基本上我在想一个联网的iPhone应用程序 - 但我不想依赖于低级二进制协议,因为使用类似XMPP的东西意味着应用程序可以从基于本地wifi的应用程序快速“成长”到基于互联网的应用程序...
交换的消息应该是相对较低的延迟,所以严格来说二进制协议是最好的,但我觉得如果XMPP没有引入太多开销以便我可以使用它然后获得好处,那么可能值得探索之后它的可扩展性和灵活性。
2)我为兵马俑工作 - 所以我有这种疯狂的想法聚集一切。一旦我开始考虑编写一些自定义服务器代码,我想我想将它集群化。 Terracotta使得Java POJO的扩展变得微不足道,所以我的想法是构建一个超级简单的XMPP服务器作为Terracotta的演示应用程序。基本上每个用户都将通过TCP连接连接到服务器,这将用户注册到散列映射。每个用户都有一个LinkedBlockingQueue,其中一个侦听器线程从队列中获取消息。然后,任何想要向任何其他用户(例如任何旧的聊天应用程序)发送消息的连接用户只需通过该连接向该用户发出XMPP消息(如通常那样)。服务器选择它,在地图中查找相应的用户对象并将消息放入队列。由于队列是群集的,因此无论目标用户是连接到同一物理服务器还是不同的物理服务器,都会传递消息,正在侦听的线程会将其拾取并将其发送回目标用户的tcp连接。
所以 - 我不害怕总结。但这就是我想要做的。我想我可以为Openfire编写一个插件来完成#1,但我认为它需要处理很多管道,因此很难做到#2(特别是因为我希望有一小部分代码能够适应简单的10-20kb Maven项目)。
答案 0 :(得分:50)
http://xmpp.org/xmpp-software/libraries/有一个XMPP软件库列表。这是过时的快照:
答案 1 :(得分:8)
我经历了同样的搜索。我首先尝试了Smack,然后意识到它的目标是c2s(客户端到服务器)并且没有我需要的东西。我看着Tinder,但不喜欢许可模式(当我看起来它更加原始时)。我终于看了一眼Whack并意识到这是我需要的东西 - 但它缺少了很多(这就是为什么Tinder出现的原因)。
那么......我的解决方案? Forked Whack,添加了一些代码来抽象出来,并尝试使其更易于使用:http://github.com/Communitivity/Adirondack
我写了一个基于它的Scala库来帮助创建基于外部组件的代理,请参阅 http://github.com/Communitivity/Shellack 和http://github.com/Communitivity/MinimalScalaXMPPComponent
我的主要目标之一是快速编写组件。这种组件的一个例子如下:
object Main {
/**
* @param args the command line arguments
*/
def main(args: Array[String]) :Unit = {
new XMPPComponent(
new ComponentConfig() {
def secret() : String = { "secret.goes.here" }
def server() : String = { "communitivity.com" }
def subdomain() : String = { "weather" }
def name() : String = { "US Weather" }
def description() : String = { "Weather component that also supported SPARQL/XMPP" }
},
actor {
loop {
react {
case (pkt:Packet, out : Actor) =>
Console.println("Received packet...\n"+pkt.toXML)
pkt match {
case message:Message =>
val reply = new Message()
reply.setTo(message.getFrom())
reply.setFrom(message.getTo())
reply.setType(message.getType())
reply.setThread(message.getThread())
reply.setBody("Received '"+message.getBody()+"', tyvm")
out ! reply
case _ =>
Console.println("Received something other than Message")
}
case _ =>
Console.println("Received something other than (Packet, actor)")
}
}
}
).start
}
}
答案 2 :(得分:4)
Ignite Realtime共享其Tinder API,这是从OpenFire中提取的基本构建块,仅用于创建服务器端组件和可能的其他服务器。它实现了基本的XMPP构建块,您可以从那里开始。
答案 3 :(得分:3)
同样来自Ignite Realtime的是Whack API,它专门用于构建XMPP组件
Whack是开源XMPP(Jabber) XMPP组件的组件库。 一个纯Java库,它可以 嵌入到您的应用程序中 从完整的XMPP创建任何东西 组件到简单的XMPP集成 如发送拦截和 对某些信息采取行动。
答案 4 :(得分:2)
您最好的选择是使用现有服务器,并为其添加功能。即使使用库,从头开始编写整个服务器也会比您预期的更难批次。
您能告诉我们您正在尝试解决的问题吗?然后,我们可以为您指出一个合适的服务器,并帮助您找到合适的插件。
答案 5 :(得分:1)
检查一下:
这是一个较低级别的库。它处于孵化状态,似乎没有人在推动它。但这是一个伟大的api,我希望它会进步。
答案 6 :(得分:1)
我认为您已经找到了正确的解决方案: Openfire
这不是商业解决方案。它是在Apache许可下发布的用Java编写的Mina和Jetty 之上的XMPP服务器。非常接近你所要求的。 虽然我知道您要求使用库,但为什么不使用一些稳定开发的开源软件,这些软件可以像openfire一样轻松扩展?
答案 7 :(得分:0)
我找到了一个基于Java的好的xmpp服务器:http://www.tigase.org/
答案 8 :(得分:0)
看看Vorpal。它是一个实现XEP-0114协议的Java EE 6框架。
答案 9 :(得分:0)
我知道目的是在OP中建立一个小黑客。 但是,如果有兴趣扩展它,端到端的安全性, 我建议从Coversant看看Soapbox。 他们是我们的伙伴。我们在硬实时虚拟机环境中使用SMACK,JamaicaVM与Soapbox进行通信。
此外,如果目的是与服务器应用程序通信,而不是重新实现 在XMPP服务器(例如Soapbox)中,可以使用SMACK客户端。 它是XMPP服务器的客户端,但实际通信的实例可以是 通过XMPP服务器从客户端到客户端。