বাংলায় অ্যান্ড্রয়েড সহায়িকা - Bangla Android Guide

নেটওয়ার্কে সার্ভিস উম্মোচন করা

নেটওয়ার্ক জীবনে পরিপূর্ন, নৃশংস নেটওয়ার্ক প্রিন্টার থেকে শুরু করে নিরীহ নেটওয়ার্ক ওয়েবক্যাম পর্যন্ত, নিষ্ঠুর, নিকটস্থ টিক-ট্যাক-টো প্লেয়ার এর ভয়ংকর যুদ্ধ পর্যন্ত। আপনার অ্যাপলিকেশনকে এই জীবন্ত ইকোসিস্টেমটি দেখতে দেওয়ার উপায় হচ্ছে সার্ভিস ডিসকোভারি (খুজে বের করা)। কোন সার্ভিস সহজপ্রাপ্য আছে তা দেখতে আপনার অ্যাপরিকেশনের নেটওয়ার্কে সার্ভিস সম্প্রচার (ব্রডকাস্ট) শোনা প্রয়োজন এবং অ্যাপরিকেশন যেটার সাথে কাজ করতে পারবেসেটা বেছে নেয়া।

সার্ভিস ডিসকোভারি (খুজে বের করা), সার্ভিস রেজিস্ট্রেশনের মতো কোন ধাপ নেই: প্রাসঙ্গিক কলব্যাকের সাথে একটি ডিসকোভারি লিসেনার সেট করা, এবং discoverServices() এ কর করা একটি একক আসিঙক্রোনাস এপিআই তৈরী করা।

প্রথমে,একটি নামহীন ক্লাস শুরু করুন যা NsdManager.DiscoveryListener বাস্তবায়ন করে। নিম্নোক্ত খন্ডাংশটি একটি সহজ উদাহরন দেখাচ্ছে:

public void initializeDiscoveryListener() {

    // Instantiate a new DiscoveryListener
    mDiscoveryListener = new NsdManager.DiscoveryListener() {

        //  Called as soon as service discovery begins.
        @Override
        public void onDiscoveryStarted(String regType) {
            Log.d(TAG, "Service discovery started");
        }

        @Override
        public void onServiceFound(NsdServiceInfo service) {
            // A service was found!  Do something with it.
            Log.d(TAG, "Service discovery success" + service);
            if (!service.getServiceType().equals(SERVICE_TYPE)) {
                // Service type is the string containing the protocol and
                // transport layer for this service.
                Log.d(TAG, "Unknown Service Type: " + service.getServiceType());
            } else if (service.getServiceName().equals(mServiceName)) {
                // The name of the service tells the user what they'd be
                // connecting to. It could be "Bob's Chat App".
                Log.d(TAG, "Same machine: " + mServiceName);
            } else if (service.getServiceName().contains("NsdChat")){
                mNsdManager.resolveService(service, mResolveListener);
            }
        }

        @Override
        public void onServiceLost(NsdServiceInfo service) {
            // When the network service is no longer available.
            // Internal bookkeeping code goes here.
            Log.e(TAG, "service lost" + service);
        }

        @Override
        public void onDiscoveryStopped(String serviceType) {
            Log.i(TAG, "Discovery stopped: " + serviceType);
        }

        @Override
        public void onStartDiscoveryFailed(String serviceType, int errorCode) {
            Log.e(TAG, "Discovery failed: Error code:" + errorCode);
            mNsdManager.stopServiceDiscovery(this);
        }

        @Override
        public void onStopDiscoveryFailed(String serviceType, int errorCode) {
            Log.e(TAG, "Discovery failed: Error code:" + errorCode);
            mNsdManager.stopServiceDiscovery(this);
        }
    };
}

NSD API আপনার অ্যাপলিকেশনের জ্ঞাতার্থে এই ইন্টারফেসে পদ্ধতিটি ব্যবহার করে যখন ডিসকোভারি শুরু হয়, যখন এটা ব্যর্থ হয় এবং সার্ভিস পাওয়া যায় এবং হারিয়ে যায় (হারিয়ে যাওয়া মানে ”এখন আর সহজপ্রাপ্য নয়”)। মনে রাখবেন এই খন্ডাংশটি কিচু চেক করে না যখন একটি সার্ভিস পাওয়া যায়।

  1. খুজে পাওয়া সার্ভিসের সার্ভিস নাম লোকাল সার্ভিসের সার্ভিস নামের সাথে তুলনা করা হয়, এটা নির্ধারন করতে যে যদি ডিভাইস শুধু তার নিজস্ব সম্প্রচার (ব্রডকাস্ট) তুলে নেয়।

  2. এটা এমন ধরনে সার্ভিস যার সাথে আপনার অ্যাপরিকেশন সংযোগ স্থাপন করতে পারে, তাই সার্ভিস টাইপ চেক করা হয়।

  3. সঠিক অ্যাপরিকেশনে সংযোগ যাচাই করতে সার্বিস নাম চেক করা হয়

সার্ভিস নাম চেক করা সবসময জরুরী নয় এবং আপনি যদি কোন নির্দিস্ট অ্যাপলিকেশনের সাথে যুক্ত হতে চান তখনই শুধু এটা প্রসঙ্গিক। উদাহরনস্বরূপ, অ্যাপলিকেশন অন্য ডিভাইসে রান করার সময় এর নিজস্ব ইনসটেন্স এর সাতে যুক্ত হতে চাইবে। কিন্তু, যদি অ্যাপলিকেশন একটি নেটওয়ার্ক কানেকশনের সাথে যুক্ত হতে চায এটা দেখাই যথেষ্ট যে সার্ভিস টাইপ হচ্ছে "_ipp._tcp"।

লিসেনার সেটআপ করার পর, discoverServices()কল করুন, আপনার অ্যাপলিকেশনের যা খোজা উচিত সেই সার্ভিস টাইপের মধ্যে পাস করতে, ডিসকভারি প্রটোকল ব্যবহার করতে এবং লিসেনার আপনি যা মাত্র তৈরী করেছেন।

mNsdManager.discoverServices(
        SERVICE_TYPE, NsdManager.PROTOCOL_DNS_SD, mDiscoveryListener);