مكتبات XMPP Java جيدة لجانب الخادم؟ [مغلق

StackOverflow https://stackoverflow.com/questions/177514

  •  05-07-2019
  •  | 
  •  

سؤال

كنت آمل في تنفيذ خادم XMPP بسيط في Java.

ما أحتاجه هو مكتبة يمكنها تحليل وفهم طلبات XMPP من العميل. لقد نظرت إلى Smack (المذكورة أدناه) و JSO. يبدو أن Smack عميل فقط ، لذا في حين أنه قد يساعد في تحليل الحزم ، فإنه لا يعرف كيفية الاستجابة للعملاء. هل تم الحفاظ على JSO يبدو قديمًا جدًا. الطريق الواعد الوحيد هو تفكيك Fearfire وهو خادم XMPP التجاري بالكامل (OSS).

كنت آمل فقط في الحصول على بضعة أسطر من التعليمات البرمجية أعلى Netty أو Mina ، لذلك يمكن أن أبدأ في معالجة بعض الرسائل من السلك.


جو -

حسنًا ، الإجابة على ما أحاول القيام به طويل إلى حد ما - سأحاول أن أبقيه قصيرًا.

هناك شيئان ، يرتبطان فقط بشكل فضفاض:

1) أردت أن أكتب خادم XMPP لأنني أتخيل كتابة بروتوكول مخصص لعملتين للتواصل. في الأساس ، أفكر في تطبيق iPhone متصل بالشبكة - لكنني لم أرغب في الاعتماد على البروتوكولات الثنائية ذات المستوى المنخفض لأن استخدام شيء مثل XMPP يعني أن التطبيق يمكن أن "يكبر" بسرعة كبيرة من تطبيق WiFi المحلي إلى تطبيق على الإنترنت ...

يجب أن يكون MSGs المتبادلة زمنًا منخفضًا نسبيًا ، لذا سيكون من الأفضل التحدث ببروتوكول ثنائي ، لكنني شعرت أنه قد يكون من المفيد استكشاف ما إذا لم يقدم XMPP الكثير من النفقات العامة بحيث يمكنني استخدامه ثم جني فوائده والمرونة في وقت لاحق.

2) أعمل لدى Terracotta - لذلك لدي هذا العازف المجنون لأتجمع كل شيء. بمجرد أن بدأت التفكير في كتابة بعض رمز الخادم المخصص ، كنت أحسب أنني أردت تجميعها. يجعل Terracotta تحجيم Java Pojos Trivial ، لذلك كان فكرتي في بناء خادم XMPP بسيط للغاية كتطبيق عرضي لـ Terracotta. في الأساس ، سيتصل كل مستخدم بالخادم عبر اتصال TCP ، والذي من شأنه تسجيل المستخدم في hashmap. سيكون لكل مستخدم رسالة LinkedBlockingQueue مع رسالة مستمع تأخذ رسالة من قائمة الانتظار. ثم أي مستخدم متصل يريد إرسال رسالة إلى أي مستخدم آخر (على سبيل المثال أي تطبيق دردشة قديم) يصدر ببساطة رسالة XMPP (كالعادة) إلى هذا المستخدم عبر الاتصال. يقوم الخادم بتقاطه ، ويبحث عن كائن المستخدم المقابل في خريطة ويضع الرسالة في قائمة الانتظار. نظرًا لأن قائمة الانتظار مجمعة ، بغض النظر عن Wether ، يتم توصيل المستخدم الوجهة إلى الخادم الفعلي نفسه ، أو خادم فعلي مختلف ، يتم تسليم الرسالة والخيط الذي يستمع إليه يلتقطه ويرسله إلى أسفل اتصال TCP للمستخدم الوجهة.

لذلك - ليس أقل من ملخص أخشى. لكن هذا ما أريد أن أفعله. أفترض أنه يمكنني فقط كتابة مكون إضافي لـ OpenFire لإنجاز رقم 1 ، لكنني أعتقد أنه يعتني بالكثير من السباكة ، لذا من الصعب القيام بـ #2 (خاصةً لأنني كنت آمل في الحصول على كمية صغيرة جدًا من التعليمات البرمجية التي يمكن أن تتناسب مع مشروع Maven بسيط 10-20 كيلو بايت).

هل كانت مفيدة؟

المحلول

http://xmpp.org/xmpp-software/libraries/ لديه قائمة من مكتبات البرامج لـ XMPP. هنا هو عفا عليها الزمن لقطة منه:

ActionScript

ج

C ++

C# / .NET / MONO

إرلانج

فلاش

هاسكل

جافا

جافا سكريبت

lisp

ج موضوعية

بيرل

بي أتش بي

بيثون

روبي

TCL

نصائح أخرى

ذهبت من خلال نفس البحث. لقد جربت لأول مرة Smack ثم أدركت أنها تستهدف C2S (العميل إلى الخادم) ولم يكن لدي ما أحتاجه. نظرت إلى Tinder لكنني لم أحب نموذج الترخيص (أيضًا عندما نظرت إلى أنه كان أكثر من ذلك بكثير). نظرت أخيرًا إلى Whack وأدركت أنه ما احتاجه - لكنه فقد الكثير (لهذا السبب جاء Tinder على ما أعتقد).

لذلك .. حلي؟ أضرب متشوقًا ، أضاف بعض التعليمات البرمجية لتجريد الأشياء ، ومحاولة تسهيل استخدام: 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
  }
}

تشارك في الوقت الفعلي Tinder API وهي لبنة أساسية مستخرجة من OpenFire فقط لإنشاء مكونات من جانب الخادم وربما خوادم أخرى. إنه ينفذ لبنات بناء XMPP الأساسية وأنت حر في البدء من هناك.

أيضا من Ignite في الوقت الفعلي هو Whack API وهو على وجه التحديد لبناء مكونات XMPP

Whack عبارة عن مكتبة مكونات Open Source XMPP (Jabber) لمكونات XMPP. مكتبة Java النقية ، يمكن دمجها في تطبيقاتك لإنشاء أي شيء من مكون XMPP كامل إلى تكامل XMPP البسيط مثل إرسال اعتراض وتصرف على بعض الرسائل.

أفضل رهان لك هو استخدام خادم موجود ، وإضافة وظيفتك إليه. كتابة خادم كامل من نقطة الصفر ، حتى باستخدام مكتبة ، ستكون كثير أصعب مما تتوقع.

هل يمكن أن تخبرنا المزيد عن المشكلة التي تحاول حلها؟ يمكننا بعد ذلك توجيهك إلى خادم مناسب ، ومساعدتك في المكان المناسب لتوصيله.

تحقق من هذا:

هذه مكتبة المستوى الأدنى. إنه في حالة الحضانة ويبدو أنه لا أحد يدفعه. لكنها واجهة برمجة تطبيقات رائعة وآمل أن تتقدم.

http://java.net/project/jso-jabber-stream-objects

أعتقد أنك نظرت بالفعل إلى الحل الصحيح: فتح النار

إنه ليس حلاً تجاريًا. إنه خادم XMPP على قمة مينا والرصيف مكتوبة في جافا التي تم إصدارها بموجب ترخيص Apache. يأتي بالقرب من ما طلبته. على الرغم من أنني أعلم أنك طلبت مكتبة ، فلماذا لا تستخدم بعض البرامج المفتوحة المصدر المطورة المستقرة والتي يمكن تمديدها بسهولة مثل OpenFire؟

لقد وجدت خادم XMPP جيد يعتمد على Java: http://www.tigase.org/

القي نظرة على Vorpal. إنه إطار Java EE 6 الذي ينفذ بروتوكول XEP-0114.

أعلم أن القصد هو بناء اختراق صغير في البروتوكول الاختياري. ومع ذلك ، إذا كان هناك اهتمام في توسيع نطاقه ، والأمان من طرف إلى طرف ، وما إلى ذلك ، أود أن أقترح النظر في صندوق الصابون من Coversant. هم شريكنا. نستخدم Smack على بيئة الجهاز الظاهري الصعبة في الوقت الفعلي ، Jamaicavm للتواصل مع Soapbox.

أيضًا ، إذا كان القصد من ذلك هو التواصل مع تطبيق الخادم ، وليس لإعادة تنفيذ خادم XMPP (على سبيل المثال) ، يمكن استخدام عميل Smack لذلك. إنه عميل لخادم XMPP ، ولكن يمكن أن يكون مثيل الاتصالات الفعلية من العميل إلى العميل من خلال خادم XMPP.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top