एंड्रॉइड ऐप में उपयोग करने के लिए कौन सी वेबसॉकेट लाइब्रेरी है? [बन्द है]


131

मैं अपने एंड्रॉइड ऐप में एक सेवा जोड़ना चाहता हूं जो एक वेबस्केट कनेक्शन (संभवत: कई घंटे या यहां तक ​​कि दिन) धारण करने वाली पृष्ठभूमि में चलता है और नियमित रूप से कुछ डेटा सर्वर पर भेजता है।

अब जावा के लिए WebSocket लाइब्रेरी का एक समूह प्रतीत होता है, और मुझे यकीन नहीं है कि मुझे कौन सा उपयोग करना चाहिए:

इसके अलावा, एंड्रॉइड के लिए एक देशी सॉकेट.आईओ क्लाइंट लाइब्रेरी है:

  • nkzawa / socket.io-client.java GitHub से विवरण: जावा के लिए पूर्ण विशेषताओं वाले सॉकेट.आईओ क्लाइंट लाइब्रेरी, जो सॉकेट.आईओ v1.0 और बाद में संगत है।

एंड्रॉइड क्लाइंट का उपयोग करने के लिए एंड्रॉइड क्लाइंट मेरे लिए उपयोगी होगा, क्योंकि मैं वैसे भी वेब फ्रंट के लिए नोडज / सॉकेट.आईओ का उपयोग करने की योजना बना रहा हूं। लेकिन मूल ग्राहक काफी युवा है और कई खुले मुद्दे हैं। और इसके अलावा, यह मेरी समझ है कि एक एंड्रॉइड ऐप में सॉकेट.आईओ क्लाइंट लाइब्रेरी (सॉकेट.आईओ 1.0 सर्वर के साथ संगत होने के अलावा) का उपयोग करने का कोई लाभ नहीं है, क्योंकि क्लाइंट साइड में वेबस्केट समर्थन का आश्वासन दिया जा सकता है ।

मेरी आवश्यकताएं इस प्रकार हैं:

  • एंड्रॉइड एपीआई 9 और उच्चतर के साथ संगतता
  • SSL के माध्यम से जुड़ने की संभावना
  • एक स्थायी वैकलॉक को पकड़े बिना लंबे समय तक संबंध बनाए रखें
  • उपलब्ध नोडजेस वेबसोकेट सर्वर कार्यान्वयन के साथ या सॉकेट.आईओ के साथ संगतता

कोई सुझाव जो इन आवश्यकताओं के लिए सही पुस्तकालय है?



2
मैं WebSocket और न ही वायुमंडल पर कोई विशेषज्ञ नहीं हूँ। मुझे केवल यह पता है कि वायुमंडल अच्छी तरह से पहना जाता है, जिसका उपयोग वेबसॉकेट समर्थन सहित पुश सुविधाओं के लिए कई परियोजनाओं में किया जाता है । मेरा एकमात्र अनुभव अप्रत्यक्ष है, वाडिन वेब ऐप्स बनाने में। वाडिन अपनी स्वचालित पुश क्षमता के लिए वायुमंडल का उपयोग करता है। लेकिन खबरदार, अपने संक्षिप्त इतिहास के दौरान कई परिभाषाओं, परिभाषाओं और विभिन्न कार्यान्वयनों के साथ वेबसोकेट अभी भी अपेक्षाकृत नया है। इसलिए "मुद्दों" की अपेक्षा करें कि आप कैसे जाएं।
बेसिल बोर्के

2
FYI करें, ऑटोबान वहां से बाहर है और उनके पास एक आकर्षक वेबसाइट है। लेकिन कोई सूचना नहीं है कि "सुरक्षित वेबसॉकेट लागू नहीं किया गया" जब तक आप इसे स्थापित करने और इसे चलाने का प्रयास करने के लिए समय नहीं बिताते हैं। आगे।
बादलोंफिन

1
मेरे पास टिप्पणी करने के लिए पर्याप्त प्रतिष्ठा नहीं है, इसलिए मैं इसे उत्तर के रूप में लिख रहा हूं क्योंकि मैं आपके प्रश्न में उल्लिखित समान आवश्यकताओं से गुजरा हूं और okhttp ने मुझे सभी आवश्यकताओं को पूरा करने में मदद की है। यह संस्करण 3.5 की शुरुआत के बाद से वेब सॉकेट्स का समर्थन करता है, इसलिए इसका एक और फायदा है OKHttp (वेब ​​सेवा कॉल + वेब सॉकेट) का उपयोग करने के लिए। यहाँ से शुरू करने के लिए लिंक है। < medium.com/@ssaurel/… >
कलीम पटेल

7
इस तरह के सवाल बंद नहीं होने चाहिए।
मार्टिन बर्गर

जवाबों:


123

कुछ नोट।

  • koush / AndroidAsync समापन हैंडशेक का प्रदर्शन नहीं करता है जो RFC 6455 द्वारा आवश्यक है । देखें इस जानकारी के लिए।

  • प्रोजेक्ट टायरस एंड्रॉइड पर काम करता है, लेकिन यह सुनिश्चित कर लें कि इसका लाइसेंस ( CDDL 1.1 और GPL 2 CPE के साथ ) और इसका आकार ( ProGuard के साथ Reducing WebSocket क्लाइंट जार आकार ) आपकी आवश्यकताओं को पूरा करता है। यह भी ध्यान दें कि पाठ का आकार बड़ा होने पर (यह शायद एक बग है) टायर्स अपवाद छोड़ सकते हैं। देखें इस जानकारी के लिए।

  • जेट्टी : जेट्टी-उपयोगकर्ता मेलिंग सूची में 2 साल पहले का ईमेल थ्रेड कहता है, "हमारे पास वर्तमान में कोई एंड्रॉइड संगत जेट्टी 9 वेबस्केट क्लाइंट नहीं है। जेडीके 7 से जेडीके 5/6 तक एंड्रॉइड के लिए जेट्टी वेबसोकेट क्लाइंट को वापस करने का प्रयास करने की योजना है। उपयोग करें, लेकिन JSR-356 Java WebSocket API (javax.websocket) के हमारे कार्यान्वयन को पूरा करने की तुलना में इसकी प्राथमिकता कम है। " जेटी के वर्तमान दस्तावेज़ इसके WebSocket Client API के बारे में Android के बारे में कुछ भी उल्लेख नहीं किया गया है।

  • codebutler / android-websocket समापन हैंडशेक का प्रदर्शन नहीं करता है जो RFC 6455 द्वारा आवश्यक है और पास पर अपवाद फेंक सकता है। देखें इस

  • वायुमंडल / wasync अपने WebSocket कार्यान्वयन के रूप में AsyncHttpClient / async-http-client का उपयोग करता है । इसलिए, इसके बजाय, AsyncHttpClient / async-http-client का उल्लेख किया जाना चाहिए।

  • फायरबेस / ट्यूबस्कॉक सत्यापित नहीं करता है Sec-WebSocket-Accept। यह RFC 6455 के खिलाफ उल्लंघन है । इसके अलावा, TubeSock में एक टेक्स्ट संदेश बनाने के लिए एक बग है। यदि आप टेक्स्ट संदेशों के लिए मल्टी-बाइट UTF-8 वर्णों का उपयोग करते हैं, तो आप जल्द ही या बाद में बग का सामना करेंगे। देखें समस्या 3 में खुशी-आईएम / एंड्रॉयड-डीडीपी Tubesock समस्याओं के बारे में एक लंबी सूची के लिए।

विचार बिंदु

जावा में लिखे गए WebSocket क्लाइंट कार्यान्वयन को चुनने में विचार बिंदु:

  1. अनुपालन । कम संख्या में कार्यान्वयन RFC 6455 द्वारा आवश्यक समापन हैंडशेक को लागू नहीं करते हैं । (यदि समापन हैंडशेक लागू नहीं हुआ है तो क्या होता है? यह देखें ।)
  2. आवश्यक जावा संस्करण । जावा एसई 5, 6, 7, 8 या जावा ईई? Android पर भी काम करता है?
  3. आकार । कुछ कार्यान्वयन में कई निर्भरताएँ होती हैं।
  4. wss का समर्थन
  5. HTTP प्रॉक्सी सपोर्ट।
  6. HTTP प्रॉक्सी सपोर्ट पर wssएचटीएमएल 5 वेब सॉकेट्स में चित्रा 2 देखें प्रॉक्सी सर्वर के साथ बातचीत करें कि एक वेबसकेट क्लाइंट लाइब्रेरी को HTTP प्रॉक्सी पर wss का समर्थन करने के लिए क्या करना है।
  7. SSL कॉन्फ़िगरेशन पर लचीलापनSSLSocketFactoryऔर SSLContextअनावश्यक प्रतिबंधों के बिना उपयोग करने में सक्षम होना चाहिए।
  8. बेसिक ऑथेंटिकेशन सहित ओपन हैंडशेक में कस्टम HTTP हेडर
  9. HTTP HTTP बातचीत में कस्टम HTTP हेडर , प्रॉक्सी सर्वर पर प्रमाणीकरण सहित।
  10. सभी फ़्रेम प्रकार (निरंतरता, बाइनरी, पाठ, पास, पिंग और पोंग) या नहीं भेजने में सक्षम । अधिकांश कार्यान्वयन मैन्युअल रूप से खंडित फ़्रेम और अनचाही पोंग फ़्रेम भेजने के लिए डेवलपर्स के साथ प्रदान नहीं करते हैं ।
  11. विभिन्न वेबसॉकेट घटनाओं को प्राप्त करने के लिए श्रोता इंटरफ़ेस । एक खराब इंटरफ़ेस डेवलपर्स को निराश करता है। एक समृद्ध इंटरफ़ेस डेवलपर्स को मजबूत एप्लिकेशन लिखने में मदद करता है।
  12. WebSocket राज्य या नहीं पूछताछ करने में सक्षमRFC 6455 कनॉटिंग , OPEN, CLOSING और CLOSED राज्यों को परिभाषित करता है, लेकिन कुछ कार्यान्वयन परिभाषित तरीके से अपने आंतरिक राज्य संक्रमण को बनाए रखते हैं।
  13. सॉकेट कनेक्शन के लिए टाइमआउट मान सेट करने में सक्षम । ( विधि के दूसरे तर्क के बराबर )Socket.connect(SocketAddress endpoint, int timeout)
  14. अंतर्निहित कच्चे सॉकेट तक पहुंचने में सक्षम
  15. सहज उपयोग में आसान एपीआई या नहीं।
  16. अच्छी तरह से प्रलेखित या नहीं।
  17. RFC 7692 (WebSocket के लिए संपीड़न एक्सटेंशन) समर्थन (उर्फ परमेस-डिफ्लेट)।
  18. पुनर्निर्देशन (3xx) समर्थन।
  19. डाइजेस्ट ऑथेंटिकेशन सपोर्ट।

nv-websocket- क्लाइंट में पिछले दो को छोड़कर सभी उपरोक्त शामिल हैं। इसके अलावा, इसकी छोटी लेकिन सुविधाजनक विशेषताओं में से एक समय-समय पर पिंग / पोंग फ्रेम भेजना है। इसे केवल कॉलsetPingInterval/setPongIntervalविधियों ( JavaDoc देखें)द्वारा प्राप्त किया जा सकता है।

डिस्क्लेमर: तकाहिको कावासाकी nv-websocket-client के लेखक हैं।


1
क्या nv-websocket- क्लाइंट लाइब्रेरी अभी भी विकास के अधीन है? मैं भी त्रुटि 1006 और NO कारण के साथ TooTallNate / Java-WebSockets के साथ स्वत: वियोग मुद्दे का सामना करना पड़ा .. यह nv-websocket भी इसे हल करता है?
अंकित बंसल

1
1006 के लिए, विनिर्देशन (RFC 6455) बताता है कि कोड को समापन बिंदु द्वारा बंद नियंत्रण फ़्रेम में स्थिति कोड के रूप में सेट नहीं किया जाना चाहिए । इसका मतलब है कि कोड क्लाइंट की ओर से जनरेट किया गया था। आप WebSocketListener की onDisconnectedविधि और onErrorविधि के माध्यम से वियोग के बारे में अधिक जानकारी प्राप्त कर सकते हैं । विधि आपको एक उदाहरण देती है। समस्या क्या है यह देखने के लिए इसकी विधि को बुलाओ । onErrorWebSocketExceptiongetError()
ताकाहिको कावासाकी

7
Wss के लिए, मैंने okhttp और autobahn की कोशिश की (इस उत्तर में आत्म प्रचार का संदेह भी)। ऑटोबान आसान था, लेकिन कोई एसएसएल नहीं है। OkHttp के पास शून्य (समेकित) प्रलेखन (फरवरी 2016) बहुत कम है। मैंने उनके कोड और उनके अपवादों को पढ़ने में बहुत समय बर्बाद किया, क्योंकि मैं नंगे हड्डियों का उदाहरण प्राप्त करने के लिए वर्कआर्ड (जैसे कि टाइमआउट को 0 पर सेट करना, या आने वाले संदेश को बंद करना) के लिए निजी नहीं था। उन दो (और मेरी हताशा) को डंप करते हुए, मैंने एनवी (ताज़ा) को अच्छी तरह से प्रलेखित पाया; यह एक उपद्रव के बिना काम किया।
बादलों का

1
स्क्वायर / okhttp के नए वेबसोकेट पर कोई विचार समर्थन करता है? medium.com/square-corner-blog/…
scorpiodawg

2
मुझे OkHttp के बारे में जानकारी नहीं है। मुझे खेद है कि मैं Authlete, Inc. के संस्थापक के रूप में बहुत व्यस्त हूं (" API सुरक्षा स्टार्टअप Authlete बीज धन में $ 1.2m उठाता है ") मैं OkHttp पर गौर करने और विचार बिंदुओं की सूची को अपडेट करने के लिए समय नहीं बचा सकता। मेरे उत्तर के बाद से परिवर्तनों के बारे में, CHANGES.md देखें । कृपया ध्यान दें nv-websocket- क्लाइंट सिर्फ मेरा शौक है, जबकि OkHttp को लगता है कि एक बड़ा प्रोजेक्ट 138 योगदानकर्ताओं का है।
ताकाहिको कावासाकी

4

कुछ अन्य विचार:

Tyrus Android पर काम करता है। हालाँकि, एंड्रॉइड 5.0 में इसका उपयोग करने वाले एसएसएल लाइब्रेरीज़ छोटी-छोटी हैं और एसएसएल हैंडशेक को विफल करते हैं । यह एंड्रॉइड के नए संस्करणों में तय माना जाता है, लेकिन जिस तरह से एंड्रॉइड कई उपकरणों पर अपडेट नहीं किया गया है, यह आपके लिए एक समस्या हो सकती है।

SSL अन्य वेबस्कैट कार्यान्वयन के लिए कैसे लागू किया जाता है, इसके आधार पर, यह एक समस्या भी हो सकती है।

AndroidAsync में यह SSL समस्या नहीं है। इसमें अन्य मुद्दे हैं जैसे टाइमआउट सेट न कर पाना


3

a) इस फाइल को gradle फाइल में जोड़ें

compile 'com.github.nkzawa:socket.io-client:0.3.0'

बी) एप्लिकेशन गतिविधि में इन पंक्तियों को जोड़ें:

    public class MyApplication extends Application {
     private Socket mSocket;
        {
            try {
               mSocket = IO.socket(Config.getBaseURL());

            } catch (URISyntaxException e) {
                throw new RuntimeException(e);
            }
        }

        public Socket getSocket() {
            return mSocket;
        }
}

c) इस फ़ंक्शन को अपनी गतिविधि में जोड़ें, जहाँ आपने WebSocket कहा है:

     private void websocketConnection() {
            //Get websocket from application
            MyApplication app = (MyApplication ) getApplication();
            mSocket = app.getSocket();
            mSocket.on(Socket.EVENT_CONNECT, onConnect);
            mSocket.on(Socket.EVENT_DISCONNECT, onDisconnect);
            mSocket.on(Socket.EVENT_CONNECT_ERROR, onConnectError);
            mSocket.on(Socket.EVENT_CONNECT_TIMEOUT, onConnectError);
            mSocket.on("messageFromServer", onNewLocation);
            mSocket.connect();
        } 


    private Emitter.Listener onConnect = new Emitter.Listener() {
        @Override
        public void call(Object... args) {
            runOnUiThread(() -> {
                if (!isConnected) {

                    RequestSocket mRequestSocket = new RequestSocket();

                    mRequestSocket.setToken("anil_singhania");
                   /* your parameter */
                    mSocket.emit("messageFromClient", new Gson().toJson(mRequestSocket));
                    Log.i("Socket Data", new Gson().toJson(mRequestSocket));
                    isConnected = true;
                }
            });
        }
    };

    private Emitter.Listener onDisconnect = args -> runOnUiThread(() -> {
        isConnected = false;
       /* Toast.makeText(getApplicationContext(),
                R.string.disconnect, Toast.LENGTH_LONG).show();*/
    });

    private Emitter.Listener onConnectError = args -> runOnUiThread(() -> {
         /*   Toast.makeText(getApplicationContext(),
            R.string.error_connect, Toast.LENGTH_LONG).show()*/
    });

    private Emitter.Listener onNewLocation = new Emitter.Listener() {
        @Override
        public void call(final Object... args) {
            runOnUiThread(() -> {


            });
        }
    };

यह ws: // प्रोटोकॉल का समर्थन नहीं करता है।
गिरीश भूटिया
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.