کتابخانه Socket.IO یک کتابخانه متن باز برای برنامه نویسی ارتباطات درون شبکه برای برنامه های وب و موبایل است. با استفاده از Socket.IO میتوانید ارتباطات دوطرفه و بر اساس رویدادها (event-based) بین سرور و مشتری را برقرار کنید.
استفاده از Socket.IO برای ارتباطات درون شبکه در برنامه های موبایل و وب، بسیار مفید است. برای مثال، اگر در برنامه اندرویدی خود نیاز به ارتباط درون شبکه با سرور دارید، می توانید از Socket.IO استفاده کنید تا بتوانید داده هایی را به صورت بی نهایت ارسال و دریافت کنید.
یک مثال ساده از استفاده از Socket.IO در برنامه اندرویدی میتواند به شرح زیر باشد:
ابتدا کتابخانه Socket.IO را در پروژه اندرویدی خود اضافه کنید.
implementation 'io.socket:socket.io-client:1.0.0'
حالا در برنامه خود یک شیء از کلاس Socket بسازید و با استفاده از آن به سرور متصل شوید. برای مثال، فرض کنید که شما میخواهید به یک سرور Socket.IO به آدرس http://example.com و پورت 3000 متصل شوید. در این صوره، باید کد زیر را در برنامه اضافه کنید:
socket.emit("message", "Hello, server!", new Ack() { @Override public void call(Object... args) { //receive response..... String response = (String) args[0]; Log.d("Socket", "Server response: " + response); } });
در این کد، با استفاده از رویداد emit، داده "Hello, server!" به سرور ارسال شده است. سپس با استفاده از یک Ack، پاسخ از سرور دریافت شده و در کنسول نمایش داده میشود.
این تنها یک مثال ساده از استفاده از Socket.IO در اندروید بود.
وقتی گوشی قفل میشود و دوباره باز میشود چطوری میشه اتصال Socket.IO رو باز نگه داشت؟
وقتی که گوشی شما در حالت قفل قرار دارد، برنامههای اجرا شده در آن به حالت خوابیدن (sleep) در میآیند و ارتباط آنها با سرور نیز قطع میشود. بنابراین، وقتی گوشی شما دوباره باز میشود، برنامهای که شما نوشتهاید باید دوباره به سرور متصل شود.
برای حفظ اتصال socket.io در اندروید هنگام قفل شدن گوشی ، می توانید از موارد زیر استفاده کنید:
یک سرویس پس زمینه را ایجاد کنید که اتصال socket.io را برقرار نگه دارد. هنگام باز شدن گوشی ، این اتصال همچنان برقرار خواهد بود. یک Service یک برنامه در پسزمینه است که بدون نیاز به نمایش گرافیکی، اجرا میشود. با استفاده از یک Service، میتوانید ارتباط با سرور را در پسزمینه بازنگه دارید و هنگامی که گوشی دوباره باز میشود، اتصال را دوباره برقرار کنید.
برای استفاده از یک Service در برنامهی اندروید خود، ابتدا باید یک کلاس از Serviceبسازید. برای مثال، فرض کنید کلاسی به نام SocketService را برای اتصال به سرور Socket.IO بسازید. این کلاس باید از کلاس Service ارث بری کند. به عنوان مثال:
public class SocketService extends Service{ private Socket socket; private String serverUrl = "http://example.com:3000" // آدرس سرور }
سپس درون کلاس SocketService، میتوانید متد onCreate را override کنید و اتصال به سرور Socket.IO را در آن ایجاد کنید:
@Override public void onCreate() { super.onCreate(); try { socket = IO.socket(serverUrl); socket.connect(); } catch (URISyntaxException e) { e.printStackTrace(); } } @Override public void onDestroy() { super.onDestroy(); disconnectFromSocket(); }
حالا میتوانید این Service را استفاده کنید. برای شروع Service، باید یک Intent ایجاد کنید و آن را با استفاده از متد startService() اجرا کنید. به عنوان مثال:
Intent intent = new Intent(this, SocketService.class); startService(intent);
با اجرای این کد، Service شما شروع به کار میکند و اتصال به سرور Socket.IO برقرار میشود. حالا وقتی که گوشی شما به حالت قفل درآمده و دوباره باز میشود، Service شما نیز در پسزمینه اجرا میشود و اتصال به سرور Socket.IOرا دوباره برقرارمیکند. این روش به شما این امکان را میدهد که اتصال Socket.IO را در برنامه خود بازنگه دارید و از قطع شدن اتصال در هنگام قفل شدن گوشی جلوگیری کنید.
در اکتیویتی خود، متدهای () و () را پیاده سازی کنید. در () ، اتصال socket.io را متوقف کنید. در () ، مجددا اتصال را برقرار نمایید.
برای اینکه بتوانید از PowerManagerو WakeLock برای حفظ اتصال Socket.IO در اندروید استفاده کنید، باید ابتدا اجازه دسترسی به دستگاه در حالت خوابیدن را در فایل AndroidManifest.xml برنامه اضافه کنید. برای این کار، کد زیر را به فایل AndroidManifest.xml اضافه کنید:
<uses-permission android:name="android.permission.WAKE_LOCK" />
حالا برای استفاده از PowerManager و WakeLock، باید ابتدا یک شیء از PowerManager بسازید و سپس با استفاده از آن، یک WakeLock بسازید.
به عنوان مثال:
درون متد ()onCreate یا ()onStartCommand یا هر جای دیگر که میخواهید از WakeLock استفاده کنید:
PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE); wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyApp::MyWakelockTag"); wakeLock.acquire();
در این کد، ابتدا یک شیء از PowerManager ساخته شده است. سپس با استفاده از آن، یک WakeLock با نوع PARTIAL_WAKE_LOCK بسازید. نوع PARTIAL_WAKE_LOCK به شما اجازه میدهد که دستگاه را در حالت خوابیده نگه دارید، اما صفحه نمایش آن را خاموش نکنید.
حالا با استفاده از WakeLock، دستگاه را در حالت خوابیده نگه دارید و اتصال Socket.IO را در پسزمینه بازنگه دارید. برای این کار، باید در متد onDestroy یا هرجای دیگر دلخواه خود، WakeLock را آزاد کنید تا بتوانید از منابع دستگاه بهرهمند شوید. به عنوان مثال:
@Override public void onDestroy() { super.onDestroy(); if (wakeLock != null && wakeLock.isHeld()){ wakeLock.release(); } }
در این کد، در متد onDestroy، WakeLock آزاد شده و منابع دستگاه رها شده است.
حالا با استفاده از PowerManager و WakeLock، میتوانید اتصال Socket.IO را در پسزمینه بازنگه دارید و از قطع شدن آن در هنگام قفل شدن گوشی جلوگیری کنید.
بهتر است توجه داشته باشید که استفاده از WakeLock ممکن است به مصرف بیشتر باطری دستگاه منجر شود، بنابراین باید به دقت کنید آن را فقط در مواردی که برای نگهداری اتصال Socket.IOبه سرور لازم است، فعال کنید.
امیدوارم با این مطالب توانسته باشم کمکی کرده باشم :)