অ্যান্ড্রয়েড অ্যাপে কোন ওয়েবসকেট লাইব্রেরি ব্যবহার করবেন? [বন্ধ]


131

আমি আমার অ্যান্ড্রয়েড অ্যাপ্লিকেশনটিতে একটি পরিষেবা যুক্ত করতে চাই যা ওয়েবস্কট সংযোগ (সম্ভবত বেশ কয়েক ঘন্টা বা এমনকি কয়েক দিনের বেশি) ধরে ব্যাকগ্রাউন্ডে চলে এবং নিয়মিত কোনও সার্ভারে কিছু ডেটা প্রেরণ করে।

এখন জাভার জন্য ওয়েবসকেট লাইব্রেরিগুলির একগুচ্ছ মনে হচ্ছে এবং আমার কোনটি ব্যবহার করা উচিত তা আমি নিশ্চিত নই:

তদতিরিক্ত, অ্যান্ড্রয়েডের জন্য একটি নেটিভ সকেট.আইও ক্লায়েন্ট লাইব্রেরি রয়েছে:

  • nkzawa / socket.io-client.java গিটহাব থেকে বর্ণনা: জাভা জন্য সম্পূর্ণ বৈশিষ্ট্যযুক্ত সকেট.আইও ক্লায়েন্ট লাইব্রেরি, যা সকেট.আইও v1.0 এবং তার সাথে সামঞ্জস্যপূর্ণ।

সকেট.আইও অ্যান্ড্রয়েড ক্লায়েন্টটি ব্যবহার করা আমার পক্ষে সুবিধাজনক হবে, কারণ আমি যাইহোক ওয়েব ফ্রন্টএন্ডের জন্য নোডেজ / সকেট.আইও ব্যবহার করার পরিকল্পনা করছি। তবে নেটিভ ক্লায়েন্ট বেশ তরুণ এবং বেশ কয়েকটি উন্মুক্ত সমস্যা রয়েছে। এবং এগুলি ছাড়াও এটি আমার বোধগম্য যে কোনও অ্যান্ড্রয়েড অ্যাপ্লিকেশনটি সকেট.ইও ক্লায়েন্ট লাইব্রেরি (সকেট.ইও 1.0 সার্ভারের সাথে সামঞ্জস্যপূর্ণ হওয়া ছাড়া) ব্যবহার করার কোনও সুবিধা রাখে না, কারণ ক্লায়েন্টের পক্ষ থেকে ওয়েবস্কট সমর্থন নিশ্চিত করা যেতে পারে ।

আমার প্রয়োজনীয়তা নিম্নরূপ:

  • অ্যান্ড্রয়েড এপিআই 9 এবং এর চেয়ে বেশি এর সাথে সামঞ্জস্য
  • এসএসএলের মাধ্যমে সংযুক্ত হওয়ার সম্ভাবনা
  • স্থায়ী জাগ্রত না রেখে সংযোগটি দীর্ঘ সময়ের জন্য রাখুন
  • একটি উপলভ্য নোডেজ ওয়েবসকেট সার্ভার প্রয়োগের সাথে বা সকেট.ইওয়ের সাথে সামঞ্জস্য

কোন প্রয়োজনীয়তাগুলির জন্য কোনটি সঠিক লাইব্রেরি?



2
আমি ওয়েবস্কট বা বায়ুমণ্ডলের কোনও বিশেষজ্ঞ নই। আমি কেবল জানি যে বায়ুমণ্ডলটি ভালভাবে পরিহিত, ওয়েবস্কট সমর্থন সহ পুশ বৈশিষ্ট্যের জন্য অনেক প্রকল্পে ব্যবহৃত হয় । আমার একমাত্র অভিজ্ঞতা পরোক্ষ, ভাদিন ওয়েব অ্যাপ্লিকেশন তৈরিতে । ভাদিন তার স্বয়ংক্রিয় পুশ সক্ষমতার জন্য বায়ুমণ্ডল ব্যবহার করে। তবে সাবধান, ওয়েবসকেট তার সংক্ষিপ্ত ইতিহাসের সময় এর সংজ্ঞা, চশমা এবং বিভিন্ন বাস্তবায়নে অনেক পরিবর্তন করে তুলনামূলকভাবে নতুন। সুতরাং আপনি যেভাবেই যান না কেন "সমস্যাগুলি" আশা করুন।
বাসিল বাউরেক

2
এফওয়াইআই, অটোবাহান বাইরে আছে এবং তাদের একটি চটকদার ওয়েবসাইট রয়েছে। তবে আপনি এটি ইনস্টল করার জন্য সময় ব্যয় না করে এবং চালানোর চেষ্টা না করা পর্যন্ত "সুরক্ষিত ওয়েবসকেটগুলি প্রয়োগ করা হয়নি" এমনটি লক্ষ্য করুন না। পরবর্তী.
মেঘসুরফিন

1
আমার মন্তব্য করার মতো খ্যাতি নেই তাই আমি এটিকে উত্তর হিসাবে লিখছি কারণ আপনি আপনার প্রশ্নে উল্লিখিত একই প্রয়োজনীয়তাগুলি পেরিয়ে গিয়েছি এবং ওখটিটিপি আমাকে সমস্ত প্রয়োজনীয়তা মেটাতে সহায়তা করেছিল। এটি সংস্করণ ৩.৩ সংস্করণ প্রবর্তনের পর থেকে ওয়েব সকেটগুলিকে সমর্থন করে, সুতরাং ওকে এইচটিটিপি (ওয়েব পরিষেবা কল + ওয়েব সকেট সমর্থন) ব্যবহার করার এটি একটি অতিরিক্ত সুবিধা। এখানে লিঙ্কটি দিয়ে শুরু করা হবে। < माध्यम.com/@ssaurel/… >
কালেম প্যাটেল

7
এর মতো প্রশ্নগুলি বন্ধ করা উচিত নয়।
মার্টিন বার্গার

উত্তর:


123

কিছু নোট।

  • আরএফসি 6455 দ্বারা প্রয়োজনীয় যে সমাপনী হ্যান্ডশেকটি কুশ / অ্যান্ড্রয়েডএসেন্সিক সম্পাদন করে না । দেখুন এই বিস্তারিত জানার জন্য।

  • প্রোজেক্ট টায়ারস অ্যান্ড্রয়েডে কাজ করে তবে নিশ্চিত হয়ে নিন যে এর লাইসেন্স ( সিডিডিএল 1.1 এবং সিপিই সহ জিপিএল 2 ) এবং এর আকার ( প্রোগুয়ার্ডের সাথে ওয়েবস্কট ক্লায়েন্টের জারের আকার হ্রাস করা ) আপনার প্রয়োজনীয়তা পূরণ করছে। এছাড়াও নোট করুন যে পাঠ্যের আকার বড় হলে টাইরাস একটি ব্যতিক্রম ছুঁড়ে ফেলতে পারে (এটি সম্ভবত কোনও বাগ)। দেখুন এই বিস্তারিত জানার জন্য।

  • জেটি : জেটি-ব্যবহারকারীদের মেলিং তালিকায় একটি 2 বছর পূর্বে ইমেল থ্রেড বলছে "বর্তমানে আমাদের কাছে অ্যান্ড্রয়েডের সামঞ্জস্যপূর্ণ জেটি 9 ওয়েবসকেট ক্লায়েন্ট নেই and ব্যবহার করুন, তবে এটি আমাদের JSR-356 জাভা ওয়েবস্কিট এপিআই (জাভ্যাক্স.ওবসকেট) বাস্তবায়ন শেষের চেয়ে কম অগ্রাধিকার "" জেটির ওয়েবসকেট ক্লায়েন্ট এপিআই সম্পর্কে বর্তমান নথিটিতে অ্যান্ড্রয়েড সম্পর্কে কিছু উল্লেখ করা হয়নি।

  • কোডবুটার / অ্যান্ড্রয়েড-ওয়েবসকেটটি ক্লোজিং হ্যান্ডশেকটি সম্পাদন করে না যা আরএফসি 6455 দ্বারা প্রয়োজনীয় এবং এটি একটি ব্যতিক্রমটি বন্ধ করতে পারে। এই দেখুন ।

  • বায়ুমণ্ডল / wasync ব্যবহারসমূহ AsyncHttpClient / ASYNC-HTTP ক্লায়েন্ট তার WebSocket বাস্তবায়ন হিসাবে। সুতরাং, পরিবর্তে, এর পরিবর্তে AsyncHttpClient / async-http-ক্লায়েন্ট উল্লেখ করা উচিত।

  • ফায়ারবেস / টিউবসক যাচাই করে না Sec-WebSocket-Accept। এটি আরএফসি 6455 এর বিরুদ্ধে লঙ্ঘন । এছাড়াও, টিউবসকের একটি পাঠ্য বার্তা তৈরিতে বাগ রয়েছে has আপনি যদি পাঠ্য বার্তাগুলির জন্য মাল্টি-বাইট ইউটিএফ -8 অক্ষর ব্যবহার করেন তবে খুব শীঘ্রই আপনি বাগটির মুখোমুখি হবেন। দেখুন ইস্যু 3 মধ্যে আমোদ-তোমার দর্শন লগ করা / অ্যান্ড্রয়েড-DDP TubeSock সমস্যা সম্পর্কে একটি দীর্ঘ তালিকা জন্য।

বিবেচনা পয়েন্ট

জাভাতে লেখা একটি ওয়েবসকেট ক্লায়েন্ট প্রয়োগকরণ নির্বাচন করার ক্ষেত্রে বিবেচনার বিষয়গুলি:

  1. সম্মতি । অল্প সংখ্যক বাস্তবায়ন আরএফসি 6455 দ্বারা প্রয়োজনীয় ক্লোজিং হ্যান্ডশেক বাস্তবায়ন করে না । (ক্লোজিং হ্যান্ডশেক বাস্তবায়ন না হলে কী হয়? দেখুন এটি )
  2. প্রয়োজনীয় জাভা সংস্করণ । জাভা এসই 5, 6, 7, 8 বা জাভা ইই? এমনকি অ্যান্ড্রয়েডেও কাজ করে?
  3. আকার । কিছু বাস্তবায়নের অনেক নির্ভরতা থাকে।
  4. ডাব্লুএসএস সমর্থন।
  5. HTTP প্রক্সি সমর্থন।
  6. এইচটিটিপি প্রক্সি সমর্থন ওভার । এইচটিটিপি প্রক্সির মাধ্যমে ওয়েবসকেটের ক্লায়েন্ট লাইব্রেরি কী করতে হবে তা সম্পর্কে HTML5 ওয়েব সকেটগুলি কীভাবে প্রক্সি সার্ভারের সাথে ইন্টারঅ্যাক্ট করে তা চিত্র 2 দেখুন ।
  7. এসএসএল কনফিগারেশনে নমনীয়তাSSLSocketFactoryএবং SSLContextঅপ্রয়োজনীয় বিধিনিষেধ ছাড়াই কাজে লাগাতে সক্ষম হওয়া উচিত।
  8. প্রাথমিক প্রমাণীকরণ সহ উদ্বোধন হ্যান্ডশেকটিতে কাস্টম এইচটিটিপি শিরোনাম
  9. প্রক্সি সার্ভারে প্রমাণীকরণ সহ HTTP প্রক্সি আলোচনায় কাস্টম HTTP শিরোনাম
  10. সমস্ত ফ্রেমের প্রকারগুলি (ধারাবাহিকতা, বাইনারি, পাঠ্য, বন্ধ, পিং এবং পং) প্রেরণে সক্ষম । বেশিরভাগ বাস্তবায়নগুলি বিকাশকারীকে খণ্ডিত ফ্রেম এবং অযাচিত পং ফ্রেমগুলি ম্যানুয়ালি প্রেরণ করার উপায় সরবরাহ করে না ।
  11. শ্রোতা ইন্টারফেস বিভিন্ন ওয়েবস্কট ইভেন্ট পেতে। একটি দুর্বল ইন্টারফেস বিকাশকারীদের হতাশ করে তোলে। একটি সমৃদ্ধ ইন্টারফেস বিকাশকারীদের শক্তিশালী অ্যাপ্লিকেশন লিখতে সহায়তা করে।
  12. ওয়েবস্কট অবস্থা জিজ্ঞাসা করতে সক্ষম বা না। আরএফসি 6455 সংযুক্তি, ওপেন, ক্লোজিং এবং ক্লোজড রাজ্যগুলির সংজ্ঞা দেয়, তবে কয়েকটি বাস্তবায়ন সংজ্ঞায়িত উপায়ে তাদের অভ্যন্তরীণ রাষ্ট্রের রূপান্তর বজায় রাখে।
  13. সকেট সংযোগের জন্য একটি সময়সীমা মান সেট করতে সক্ষম । ( পদ্ধতির দ্বিতীয় যুক্তির সাথে সমান )Socket.connect(SocketAddress endpoint, int timeout)
  14. অন্তর্নিহিত কাঁচা সকেট অ্যাক্সেস করতে সক্ষম
  15. স্বজ্ঞাত সহজে ব্যবহারযোগ্য এপিআই বা না।
  16. ভাল-নথিভুক্ত বা না।
  17. আরএফসি 7692 ( ওয়েবস্কটের জন্য সংক্ষেপণ এক্সটেনশনগুলি) সমর্থন (ওরফে পারমেসেজ-ডিফল্ট)।
  18. পুনর্নির্দেশ (3xx) সমর্থন।
  19. ডাইজেস্ট প্রমাণীকরণ সমর্থন।

এনভি-ওয়েবসকেট-ক্লায়েন্ট শেষ দুটি বাদে উপরের সমস্তটি কভার করে। তদতিরিক্ত, এর একটি ছোট তবে সুবিধাজনক বৈশিষ্ট্য হ'ল পর্যায়ক্রমে পিং / পং ফ্রেম প্রেরণ করা। এটি কেবল কলsetPingInterval/setPongIntervalপদ্ধতিগুলি ( জাভাডক দেখুন)দ্বারা অর্জন করা যেতে পারে।

দাবি অস্বীকার: টাকাহিকো কাওয়াসাকি এনভি-ওয়েবসকেট-ক্লায়েন্টের লেখক।


1
এনভি-ওয়েবসকেট-ক্লায়েন্ট লাইব্রেরিটি কি এখনও চলছে? আমি TooTallNate / Java-WebSocket এর সাথে 1006 ত্রুটি এবং কোন কারণ সহ স্বয়ংক্রিয়ভাবে সংযোগ বিচ্ছিন্নতার সমস্যার মুখোমুখি হয়েছি .. এই এনভি-ওয়েবসকেটও কী এটি সমাধান করে?
অঙ্কিত বানসাল

1
1006 হিসাবে, স্পেসিফিকেশন (আরএফসি 6455) উল্লেখ করেছে যে কোডটি একটি শেষ পয়েন্ট দ্বারা একটি ক্লোজড কন্ট্রোল ফ্রেমে স্থিতি কোড হিসাবে সেট করা উচিত নয় । এর অর্থ হ'ল কোডটি ক্লায়েন্টের পক্ষে তৈরি হয়েছিল। ওয়েবসকেটলিস্টারেরonDisconnected পদ্ধতি এবং onErrorপদ্ধতির মাধ্যমে আপনি সংযোগ বিচ্ছিন্নতা সম্পর্কে আরও তথ্য পেতে পারেন । পদ্ধতি আপনাকে একটি উদাহরণ দেয় । সমস্যা কী তা দেখার জন্য এর পদ্ধতিটি কল করুন । onErrorWebSocketExceptiongetError()
টাকাহিকো কাওয়াসাকি

7
ডাব্লুএসএসের জন্য, আমি ওখটিটিপি এবং অটোবাহনের চেষ্টা করেছি (এই উত্তরে স্ব-প্রচারের জন্যও সন্দেহ)) অটোবাহন সহজ ছিল, তবে কোনও এসএসএল নেই। OkHttp এর শূন্য থেকে সামান্য (একীভূত) ডকুমেন্টেশন রয়েছে (ফেব্রুয়ারী 2016)। আমি তাদের কোড এবং তাদের ব্যতিক্রমগুলি পড়তে অনেক সময় নষ্ট করেছি কারণ আমি খালি হাড়ের উদাহরণ পেয়ে কাজ করার জন্য (যেমন টাইমআউট 0 তে নির্ধারণ করেছি, বা আগত বার্তাটি বন্ধ করে দেই) to এই দুটি (এবং আমার হতাশার) ডাম্পিং করে, আমি এনভি (সতেজ করে) ভালভাবে নথিভুক্ত পেয়েছি; এটি কোনও গোলমাল ছাড়াই কাজ করেছিল।
মেঘসুরফিন

1
স্কয়ার / ওখটিপিপি এর নতুন ওয়েবসকেটগুলিতে কোনও চিন্তাভাবনা সমর্থন করে? medium.com/square-corner-blog/...
scorpiodawg

2
আমি OkHttp সম্পর্কে বিশদ জানি না। আমি দুঃখিত আমি লেখক, ইনক । এর প্রতিষ্ঠাতা হিসাবে এতটাই ব্যস্ত (" এপিআই সুরক্ষা সূচনা লেখক বীজ তহবিলের জন্য 1.2 ​​মিলিয়ন ডলার উত্থাপন করেন ") আমি OkHttp সন্ধান করতে এবং বিবেচনার বিষয়গুলির তালিকাকে আপডেট করার জন্য সময় ব্যয় করতে পারি না। আমার উত্তর থেকে পরিবর্তনগুলি সম্পর্কে, CHANGES.md দেখুন । দয়া করে মনে রাখবেন এনভি-ওয়েবসকেট-ক্লায়েন্টটি কেবল আমার শখ, যখন OkHttp 138 জন অবদানকারী রয়েছে project
টাকাহিকো কাওয়াসাকি

4

কিছু অন্যান্য বিবেচনা:

টাইরাস অ্যান্ড্রয়েডে কাজ করে। তবে এটি অ্যান্ড্রয়েড 5.0 এ ব্যবহৃত SSL গ্রন্থাগারগুলি বগি এবং এসএসএল হ্যান্ডশেকগুলি ব্যর্থ করে । এটি অ্যান্ড্রয়েডের নতুন সংস্করণগুলিতে স্থির হওয়ার কথা, তবে যেভাবে অনেক ডিভাইসে অ্যান্ড্রয়েড আপডেট করা হয় না, এটি আপনার সমস্যা হতে পারে।

অন্যান্য ওয়েবসকেট প্রয়োগের জন্য কীভাবে এসএসএল প্রয়োগ করা হয় তার উপর নির্ভর করে এটিও সমস্যা হতে পারে।

অ্যান্ড্রয়েডএসিঙ্কের এই এসএসএল সমস্যা নেই। এটিতে টাইমআউটগুলি সেট করতে না পারার মতো অন্যান্য সমস্যা রয়েছে ।


3

ক) গ্রেড ফাইলটিতে এই ফাইলটি যুক্ত করুন

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;
        }
}

গ) আপনার ক্রিয়াকলাপে এই ফাংশনটি জুড়ুন, যেখানে আপনি ওয়েবস্কটকে ডেকেছেন:

     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(() -> {


            });
        }
    };

এটি ডাব্লুএস: // প্রোটোকল সমর্থন করে না।
গিরিশ ভূতিয়া
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.