質問
私は単純なXMPPサーバーをJavaで実装したいと思っていました。
必要なのは、クライアントからのxmpp要求を解析して理解できるライブラリです。私はSmack(以下で説明)とJSOを見てきました。 Smackはクライアントのみであるように見えるため、パケットの解析には役立ちますが、クライアントへの応答方法はわかりません。 JSOが保守されているのは非常に古いようです。唯一の有望な手段は、商用(OSS)XMPPサーバー全体であるOpenfireを分解することです。
NettyまたはMinaの上に数行のコードを追加することを望んでいたので、いくつかのメッセージの処理を開始できました。
ジョー-
まあ、私がやろうとしていることへの答えはやや長いです-私はそれを短くしようとします。
2つのことがありますが、大まかに関連しているだけです:
1)XMPPサーバーを作成したかったのは、2つのクライアントが通信するためのカスタムプロトコルを作成することを想像していたためです。基本的に、ネットワーク接続されたiPhoneアプリを考えていますが、XMPPなどを使用するとアプリが「成長」できるため、低レベルのバイナリプロトコルに依存したくありませんでした。ローカルのWi-Fiベースのアプリからインターネットベースのアプリまで非常に迅速に...
交換されるメッセージは比較的低レイテンシである必要があるため、厳密に言えばバイナリプロトコルが最善ですが、XMPPがあまりにも多くのオーバーヘッドを導入せず、それを使用して利益を享受できるかどうかを調査する価値があると感じましたその拡張性と柔軟性は後で。
2)私はTerracottaで働いています-それで、私はすべてをクラスタ化するためにこの狂った傾向があります。カスタムサーバーコードの作成について考え始めるとすぐに、それをクラスター化したいと思いました。 TerracottaはJava POJOをスケールアウトするのは簡単なので、Terracottaのデモアプリとして超シンプルなXMPPサーバーを構築することを考えていました。基本的に、各ユーザーはTCP接続を介してサーバーに接続し、ユーザーをハッシュマップに登録します。各ユーザーは、キューからメッセージを取得するリスナースレッドを持つLinkedBlockingQueueを持ちます。次に、他のユーザー(たとえば、古いチャットアプリケーション)にメッセージを送信する接続ユーザーは、接続を介してそのユーザーに(通常どおり)XMPPメッセージを発行するだけです。サーバーはそれを取得し、対応するユーザーオブジェクトをマップで検索し、メッセージをキューに配置します。キューはクラスター化されているため、宛先ユーザーが同じ物理サーバーに接続されているか、別の物理サーバーに接続されているかにかかわらず、メッセージが配信され、リッスンしているスレッドがそれを取得して宛先ユーザーのtcp接続に送り返します。
だから-要約が短すぎるのではないかと心配しています。しかし、それは私がやりたいことです。 #1を達成するためにOpenfireのプラグインを書くことができると思いますが、多くの配管を処理するので、#2を行うのは難しいと思います(特に、非常に少量のコードに適合することを望んでいたので)単純な10-20kb Mavenプロジェクト)。
解決
http://xmpp.org/xmpp-software/libraries/ にはXMPPのソフトウェアライブラリのリスト。以下に、古いスナップショットを示します:
ActionScript
C
C ++
C#/ .NET / Mono
アーラン
フラッシュ
Haskell
Java
JavaScript
Lisp
Objective-C
Perl
PHP
Python
ルビー
Tcl
他のヒント
同じ検索を行った。私は最初にSmackを試してみましたが、それがc2s(サーバーからクライアント)を対象としているのに気づき、必要なものがありませんでした。私はTinderを見ましたが、ライセンスモデルが好きではありませんでした(見たときははるかに生でした)。私はついにWhackを見て、それが私が必要とするものであることに気づきました-しかし、それは多くを失っています(だからTinderが生まれたと思うのです)。
だから..私のソリューション? Whackをフォークし、物事を抽象化するためのコードを追加し、使いやすくしようとしています: http://github.com / Communitivity / Adirondack
外部コンポーネントベースのエージェントの作成を支援するために、それに基づいてScalaライブラリを作成しました。 http://github.com/Communitivity/Shellack および http://github.com/Communitivity/MinimalScalaXMPPComponent
私の主な目標の1つは、コンポーネントをすばやく簡単に記述できるようにすることでした。そのようなコンポーネントの例を以下に示します。
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
}
}
Ignite Realtimeは Tinder API を共有しています。これはOpenFireから抽出された基本的な構成要素ですサーバー側のコンポーネントおよび場合によっては他のサーバーの作成用。基本的なXMPPビルディングブロックを実装しており、そこから自由に開始できます。
Ignite Realtimeの Whack API もビルド専用ですXMPPコンポーネント
WhackはオープンソースXMPP(Jabber)です XMPPコンポーネントのコンポーネントライブラリ。 純粋なJavaライブラリ。 アプリケーションに埋め込まれて 完全なXMPPから何かを作成する 単純なXMPP統合へのコンポーネント 傍受や 特定のメッセージに作用します。
最善の策は、既存のサーバーを使用して、それに機能を追加することです。ライブラリを使用しても、サーバー全体をゼロから作成することは、予想よりも多く難しくなります。
解決しようとしている問題について詳しく教えてください。その後、適切なサーバーを指定し、適切な場所でプラグインすることができます。
これをチェックアウト:
これは低レベルのライブラリです。それは潜伏状態にあり、誰もそれを押していないようです。しかし、それは素晴らしいAPIであり、それが進歩することを願っています。
すでに適切なソリューションを見ていると思います: Openfire
これは商用ソリューションではありません。これは、Apacheライセンスの下でリリースされたJavaで書かれたMinaとJettyの上にある XMPPサーバーです。あなたが求めたものにかなり近い。 ライブラリを要求したことは承知していますが、OpenFireのように簡単に拡張できる安定した開発済みオープンソースソフトウェアを使用してみませんか?
Javaベースの優れたxmppサーバーが見つかりました: http://www.tigase.org/
Vorpal をご覧ください。 XEP-0114プロトコルを実装するJava EE 6フレームワーク。
意図は、OPに小さなハックを作成することであることを知っています。 ただし、スケーリング、エンドツーエンドセキュリティ、 など。CoversantのSoapboxをご覧になることをお勧めします。 彼らは私たちのパートナーです。ハードリアルタイム仮想マシン環境JamaicaVMでSMACKを使用して、Soapboxと通信します。
また、意図がサーバーアプリとの通信であり、再実装ではない場合 XMPPサーバー(Soapboxなど)には、SMACKクライアントを使用できます。 XMPPサーバーのクライアントですが、実際の通信のインスタンスは XMPPサーバーを介したクライアントからクライアントへ。