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