استفاده از SignalR در اندروید
منتشر شده ۲۱ مهر ۱۳۹۳DNTips
این نوشته نخستین بار در داتنت تیپس منتشر شده است.
همانطور که مطلع هستید، بخش سورس باز مایکروسافت برای برنامهنویسهای جاوا نیز SDKی جهت استفاده از SignalR ارائه کرده است. در اینجا میتوانید مخزن کد آن را در گیتهاب مشاهده کنید. هنوز مستنداتی برای این SDK به صورت قدم به قدم ارائه نشده است. لازم به ذکر است که مراجعه به قسمتهای نوشته شده در اینجا نیز میتواند منبع خوبی برای شروع باشد. در ادامه نحوه استفاده از این SDK را با هم بررسی خواهیم کرد.
برای سمت کلاینت نیز یک پروژه Android Application داخل Eclipse به صورت زیر ایجاد میکنیم:
در ادامه نیز توسط کد زیر متد پویایی که در سمت سرور ایجاد کرده بودیم را جهت برقراری ارتباط با سرور اضافه کردهایم:
برای برقراری ارتباط نیز کدهای زیر را اضافه کردهایم. یعنی به محض اینکه با موفقیت اتصال با سرور برقرار شد پیامی بر روی صفحهنمایش ظاهر میشود:
در نهایت نیز برای نمایش اطلاعات دریافت شده کد زیر را نوشتهایم:
همانطور که عنوان شد کدهای فوق دقیقاً براساس قواعد و دستورالعمل استفاده از SignalR در سمت کلاینت میباشد.
ابتدا در سمت سرور یک Hub ساده را به صورت زیر تعریف میکنیم:
public class ChatHub : Hub
{
public void Send(string name, string message)
{
Clients.All.messageReceived(name, message);
}
}
خوب، برای استفاده از SignalR در پروژهی ایجاد شده باید کتابخانههای زیر را به درون پوشه libs اضافه کنیم، همچنین باید ارجاعی به کتابخانه Gson نیز داشته باشیم.
قدم بعدی افزودن کدهای سمت کلاینت برای SignalR میباشد. دقت داشته باشید که کدهایی که در ادامه مشاهده خواهید کرد دقیقاً مطابق دستورالمعلهایی است که قبلاً مشاهده کردهاید. برای اینکار داخل کلاس MainActivity.java کدهای زیر را اضافه کنید:
Platform.loadPlatformComponent( new AndroidPlatformComponent() );
HubConnection connection = new HubConnection(DEFAULT_SERVER_URL);
HubProxy hub = connection.createHubProxy("ChatHub");
connection.error(new ErrorCallback() {
@Override
public void onError(final Throwable error) {
runOnUiThread(new Runnable() {
public void run() {
Toast.makeText(getApplicationContext(), error.getMessage(), Toast.LENGTH_LONG).show();
}
});
}
});
hub.subscribe(new Object() {
@SuppressWarnings("unused")
public void messageReceived(final String name, final String message) {
runOnUiThread(new Runnable() {
public void run() {
Toast.makeText(getApplicationContext(), name + ": " + message, Toast.LENGTH_LONG).show();
}
});
}
});
connection.start()
.done(new Action<Void>() {
@Override
public void run(Void obj) throws Exception {
runOnUiThread(new Runnable() {
public void run() {
Toast.makeText(getApplicationContext(), "Done Connecting!", Toast.LENGTH_LONG).show();
}
});
}
});
connection.received(new MessageReceivedHandler() {
@Override
public void onMessageReceived(final JsonElement json) {
runOnUiThread(new Runnable() {
public void run() {
JsonObject jsonObject = json.getAsJsonObject();
JsonArray jsonArray =jsonObject.getAsJsonArray("A");
Toast.makeText(getApplicationContext(), jsonArray.get(0).getAsString() + ": " + jsonArray.get(1).getAsString(), Toast.LENGTH_LONG).show();
}
});
}
});
همانطور که مشاهده میکنید توسط قطعه کد زیر SKD مربوطه در نسخههای قدیمی اندروید نیز بدون مشکل کار خواهد کرد:
Platform.loadPlatformComponent( new AndroidPlatformComponent() );
در ادامه توسط متد createHubProxy ارجاعی به هابی که در سمت سرور ایجاد کردیم، دادهایم:
HubProxy hub = connection.createHubProxy("ChatHub");
در ادامه نیز توسط یک روال رویدادگردان وضعیت اتصال را چک کردهایم. یعنی در زمان بروز خطا در نحوه ارتباط یک پیام بر روی صفحه نمایش داده میشود:
connection.error(new ErrorCallback() {
@Override
public void onError(final Throwable error) {
runOnUiThread(new Runnable() {
public void run() {
Toast.makeText(getApplicationContext(), error.getMessage(), Toast.LENGTH_LONG).show();
}
});
}
});
hub.subscribe(new Object() {
@SuppressWarnings("unused")
public void messageReceived(final String name, final String message) {
runOnUiThread(new Runnable() {
public void run() {
Toast.makeText(getApplicationContext(), name + ": " + message, Toast.LENGTH_LONG).show();
}
});
}
});
connection.start()
.done(new Action<Void>() {
@Override
public void run(Void obj) throws Exception {
runOnUiThread(new Runnable() {
public void run() {
Toast.makeText(getApplicationContext(), "Done Connecting!", Toast.LENGTH_LONG).show();
}
});
}
});
connection.received(new MessageReceivedHandler() {
@Override
public void onMessageReceived(final JsonElement json) {
runOnUiThread(new Runnable() {
public void run() {
JsonObject jsonObject = json.getAsJsonObject();
JsonArray jsonArray =jsonObject.getAsJsonArray("A");
Toast.makeText(getApplicationContext(), jsonArray.get(0).getAsString() + ": " + jsonArray.get(1).getAsString(), Toast.LENGTH_LONG).show();
}
});
}
});