当前位置:  开发笔记 > 编程语言 > 正文

服务器端的优秀XMPP Java库?

如何解决《服务器端的优秀XMPPJava库?》经验,为你挑选了2个好方法。

我希望用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消息(照常).服务器选择它,在地图中查找相应的用户对象并将消息放入队列.由于队列是群集的,

所以 - 我不害怕总结.但这就是我想要做的.我想我可以为Openfire编写一个插件来完成#1,但我认为它需要处理很多管道,因此很难做到#2(特别是因为我希望有一小部分代码能够适应简单的10-20kb Maven项目).



1> prakash..:

http://xmpp.org/xmpp-software/libraries/有一个XMPP软件库列表.这是一个过时的快照:

动作脚本

as3xmpp

C

iksemel

libstrophe

大嘴巴

C++

gloox

鸢尾花

oajabber

C#/ .NET/Mono

agsXMPP SDK

闲聊网

二郎神

Jabberlang

XIFF

哈斯克尔

hsxmpp

Java的

Echomine Feridian

Jabber Stream Objects(JSO)

拍击

JavaScript的

strophe.js

xmpp4js

口齿不清

CL-XMPP

Objective-C的

xmppframework

Perl的

AnyEvent :: XMPP

PHP

Lightr

XMPPHP

蟒蛇

jabber.py

pyxmpp

SleekXMPP

扭曲的话

XMPP的PSN

xmpppy

红宝石

XMPP4R

TCL

JabberLib



2> Bill Barnhil..:

我经历了同样的搜索.我首先尝试了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
  }
}

推荐阅读
凹凸曼00威威_694
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有