নোট: এই ধাপ ঐচ্ছিক। লোকাল নেটওয়ার্ক জুরে আপনার অ্যাপের সার্ভিস সম্প্রচারিত হওয়া বিষয়ে আপনি তেমন গুরুত্ব না দেন, আপনি পরবর্তী সেকশনে চরে যেতে পারেন, Discover Services on the Network।
লোকাল নেটওয়ার্কে আপনার সার্ভিস রেজিস্টার করতে, প্রথমে একটি NsdServiceInfo অবহেজক্ট তৈরী করুন। এই অবজেক্ট তথ্য প্রদান করে যাতে নেটওয়ার্কের অন্য ডিভাইস ব্যবহার করে যখন তারা ঠিক করে কখন আপনার সার্ভিসের সাথে সংযোগ স্থাপন করতে পারে।
public void registerService(int port) {
// Create the NsdServiceInfo object, and populate it.
NsdServiceInfo serviceInfo = new NsdServiceInfo();
// The name is subject to change based on conflicts
// with other services advertised on the same network.
serviceInfo.setServiceName("NsdChat");
serviceInfo.setServiceType("_http._tcp.");
serviceInfo.setPort(port);
....
}
এই কোড খন্ডচিত্রটি "NsdChat"এ সার্বিস নাম সেট করে। নামটি নেটওয়ার্কে যে কোন ডিভাইসে দৃশ্যমান হয় যা লোকাল সার্ভিস খুজতে এনএসডি ব্যবহার করে। মনে রাখবেন যে, নেটওয়ার্কে যে কোন সার্ভিসের জন্য নামটি অবশ্যই স্বতন্ত্র হতে হবে এবং অ্যান্ড্রয়েড স্বয়ংক্রিয়ভাবে সংঘাত সমাধান পরিচালনা করে। যদি নেটওয়ার্কে দুইটা ডিভাইসই "NsdChat" অ্যাপলিকেশন ইনস্টল করে থাকে, এদেও মধ্যে একটি স্বয়ংক্রিয়ভাবে তার সার্ভিস নাম পরিবর্তন করে, যেমন হতে পারে "NsdChat (1)"।
দ্বিতীয় প্যারামিটার সার্ভিস টাইপ সেট করে, কোন প্রটোকল এবং ট্রান্সপোর্ট লেয়ার অ্যাপলিকেশন ব্যবহার করে তা নির্ধারণ করে। সিনট্যাক্স হচ্ছে "
নোট: দ্য ইন্টারন্যাশনাল অ্যাসাইনড নাম্বার অথরিটি (IANA) সার্ভিস ডিস্কোভারি প্রটোকল দ্বারা ব্যবহৃত সার্ভিস টাইপের একটি কেন্দ্রীয়, নির্ভরযোগ্য তালিকা ব্যবস্থাপনা করে, যেমন এনএসডি এবং ইড়হলড়ঁৎ। আপনি the IANA list of service names and port numbers (http://www.iana.org/assignments/service-names-port-numbers/ service-names-port-numbers.xml) থেকে তালিকাটি ডাউনলোড করে নিতে পারেন। আপনি যদি একটি নতুন সার্ভিস টাইপ ব্যবহার করার পরিকল্পনা করে থাকেন , IANA Ports and Service registration form পূর্ণ করার মাধ্যমে আপনার এর মজুদ রাখা উচিত।
যখন আপনার সার্ভিসের জন্য পোর্ট সেটিং করা হয়, এটাকে হার্ডকোডিং করা পরিহার করুন, যেহেতু এটা অন্য অ্যাপলিকেশনের সাথে সংঘাত করে। উদাহরণস্বরূপ, ধরুন যে আপনার অ্যাপলিকেশন সবসময় পোর্ট ১৩৩৭ ব্যবহার করে যা একই পোর্ট ব্যবহার করা অন্য ইনস্টল করা অ্যাপলিকেশনকে সম্ভাব্য সংঘাতের দিকে ঠেলে দেয়। পরিবর্তে ডিভাইসের অন্যান্য বিদ্যমান পোর্ট ব্যবহার করুন। কারন এই ইনফর্মেশন একটি সার্ভিস সম্প্রচারের মাধ্যমে অন্য অ্যাপে সরবরাহ করা হয়, এখানে কম্পাইল সময়ে অন্য অ্যাপলিকেশন কর্তৃক পরিচিত হওয়ার জন্য আপনার অ্যাপরিকেশনের কোন পোর্ট ব্যবহার করার দরকার নেই । পরিবর্তে অ্যাপলিকেশনটি আপনার সার্ভিস ব্রডকাস্ট থেকে এই তথ্য পেতে পারে, আপনার সার্ভিসে সংযুক্ত হওয়ার ঠিক পূর্বে।
আপনি যদি কোন সকেটের সাথে কাজ করতে থাকেন, এখানে আছে কীভাবে আপনি একটি সকেট যে কোন বিদ্যমান পোর্টে শুরু করতে পারেন শুধুমাত্র এটাকে ০ তে সেটিং করার মাধ্যমে।
public void initializeServerSocket() {
// Initialize a server socket on the next available port.
mServerSocket = new ServerSocket(0);
// Store the chosen port.
mLocalPort = mServerSocket.getLocalPort();
...
}
এখন আপনি NsdServiceInfo অবজেক্ট নির্ধারণ করেছেন, আপনার RegistrationListener ইন্টারফেস বাস্তবায়ন করা প্রয়োজন। এই ইন্টারফেস অ্যান্ড্র্রয়েড দ্বারা ব্যবহৃত কলব্যাক ধারন করে, আপনার অ্যাপলিকেশনকে সার্ভিসের রেজিট্রেশন এবং আনরেজিস্ট্রেশনের সাফল্য বা ব্যর্থতার বিষয়ে সতর্ক করতে। public void initializeRegistrationListener() { mRegistrationListener = new NsdManager.RegistrationListener() {
@Override
public void onServiceRegistered(NsdServiceInfo NsdServiceInfo) {
// Save the service name. Android may have changed it in order to
// resolve a conflict, so update the name you initially requested
// with the name Android actually used.
mServiceName = NsdServiceInfo.getServiceName();
}
@Override
public void onRegistrationFailed(NsdServiceInfo serviceInfo, int errorCode) {
// Registration failed! Put debugging code here to determine why.
}
@Override
public void onServiceUnregistered(NsdServiceInfo arg0) {
// Service has been unregistered. This only happens when you call
// NsdManager.unregisterService() and pass in this listener.
}
@Override
public void onUnregistrationFailed(NsdServiceInfo serviceInfo, int errorCode) {
// Unregistration failed. Put debugging code here to determine why.
}
};
}
এখন আপনার সার্ভিস রেজিস্টার করতে সকল অংশ আপনার আছে। registerService()পদ্ধতি কল করুন। উল্লেখ্য যে এই পদ্ধতিটি আসিঙ্ক্রনাস, সুতরাং যে কোন কোড যা সার্ভিস রেজিস্টার হওয়ার পর রান করা প্রয়োজন তা অবশ্যই onServiceRegistered()পদ্ধতির মধ্যে যাওয়া উচিত।
public void registerService(int port) {
NsdServiceInfo serviceInfo = new NsdServiceInfo();
serviceInfo.setServiceName("NsdChat");
serviceInfo.setServiceType("_http._tcp.");
serviceInfo.setPort(port);
mNsdManager = Context.getSystemService(Context.NSD_SERVICE);
mNsdManager.registerService(
serviceInfo, NsdManager.PROTOCOL_DNS_SD, mRegistrationListener);
}