# استفاده از SignalR در اندروید

همانطور که مطلع هستید، بخش سورس باز مایکروسافت برای برنامه‌نویس‌های جاوا نیز SDK ی جهت استفاده از SignalR ارائه کرده است. در اینجا می‌توانید مخزن کد آن را در گیت‌هاب مشاهده کنید. هنوز مستنداتی برای ای

- Published: 2014-10-13
- Language: fa
- Tags: DNTips
- Canonical: https://sirwan.info/blog/fa/dntips-1890

---

> این نوشته نخستین بار در [دات‌نت تیپس](https://www.dntips.ir/post/1890) منتشر شده است.

<div class="postBody">همانطور که مطلع هستید، بخش سورس باز مایکروسافت برای برنامه‌نویس‌های جاوا نیز <a href="https://www.dntips.ir/newsarchive/details/4422">SDK</a>ی جهت استفاده از SignalR ارائه کرده است. در <a href="https://github.com/SignalR/java-client">اینجا</a> می‌توانید مخزن کد آن را در گیت‌هاب مشاهده کنید. هنوز مستنداتی برای این SDK به صورت قدم به قدم ارائه نشده است. لازم به ذکر است که مراجعه به قسمت‌های نوشته شده در <a href="https://github.com/SignalR/java-client/tree/master/signalr-client-tests/src/microsoft/aspnet/signalr/client/tests/realtransport">اینجا</a> نیز می‌تواند منبع خوبی برای شروع باشد. در ادامه نحوه استفاده از این SDK را با هم بررسی خواهیم کرد.<div>ابتدا در سمت سرور یک Hub ساده را به صورت زیر تعریف می‌کنیم:</div> <div> <div align="left" dir="ltr">
<pre language="CSharp" name="code">public class ChatHub : Hub&#10;{&#10;        public void Send(string name, string message)&#10;        {&#10;            Clients.All.messageReceived(name, message);&#10;        }&#10;}</pre>
 </div>
برای سمت کلاینت نیز یک پروژه Android Application داخل Eclipse به صورت زیر ایجاد می‌کنیم:</div> <div> <p> <img src="/img/dntips/76c009583714628f58cb.jpg" style="display:block; margin-left: auto; margin-right: auto;"/> </p> </div> <div>خوب، برای استفاده از SignalR در پروژه‌ی ایجاد شده باید کتابخانه‌های زیر را به درون پوشه libs اضافه کنیم، همچنین باید ارجاعی به کتابخانه <a href="https://code.google.com/p/google-gson/">Gson</a> نیز داشته باشیم.</div> <div> <p> <img src="/img/dntips/9bb454a1ad8f9528fd4b.jpg" style="display: block; margin-left: auto; margin-right: auto; cursor: default;"/> </p> <p>قدم بعدی افزودن کدهای سمت کلاینت برای SignalR می‌باشد. دقت داشته باشید که کدهایی که در ادامه مشاهده خواهید کرد دقیقاً مطابق دستورالمعل‌هایی است که <a href="https://www.dntips.ir/courses/topic/3/073dbe11-806a-4746-9253-2a2431520a89">قبلاً</a> مشاهده کرده‌اید. برای اینکار داخل کلاس MainActivity.java کدهای زیر را اضافه کنید:</p> <div align="left" dir="ltr"> <div align="left" dir="ltr"> <div align="left" dir="ltr">
<pre language="Java" name="code">Platform.loadPlatformComponent( new AndroidPlatformComponent() );&#10;HubConnection connection = new HubConnection(DEFAULT_SERVER_URL);&#10;HubProxy hub = connection.createHubProxy("ChatHub");&#10;connection.error(new ErrorCallback() {&#10;    &#10;    @Override&#10;    public void onError(final Throwable error) {&#10;        runOnUiThread(new Runnable() {&#10;            public void run() {&#10;                Toast.makeText(getApplicationContext(), error.getMessage(), Toast.LENGTH_LONG).show();&#10;            }&#10;        });&#10;        &#10;    }&#10;});&#10;hub.subscribe(new Object() {&#10;    @SuppressWarnings("unused")&#10;    public void messageReceived(final String name, final String message) {&#10;        &#10;        runOnUiThread(new Runnable() {&#10;            public void run() {&#10;                Toast.makeText(getApplicationContext(), name + ": " + message, Toast.LENGTH_LONG).show();&#10;            }&#10;        });&#10;    }&#10;});&#10;connection.start()&#10;.done(new Action&lt;Void&gt;() {&#10;    &#10;    @Override&#10;    public void run(Void obj) throws Exception {&#10;        runOnUiThread(new Runnable() {&#10;            public void run() {&#10;                Toast.makeText(getApplicationContext(), "Done Connecting!", Toast.LENGTH_LONG).show();&#10;            }&#10;        });&#10;    }&#10;});&#10;connection.received(new MessageReceivedHandler() {&#10;    @Override&#10;    public void onMessageReceived(final JsonElement json) {&#10;        runOnUiThread(new Runnable() {&#10;            public void run() {&#10;                JsonObject jsonObject = json.getAsJsonObject();&#10;                JsonArray jsonArray =jsonObject.getAsJsonArray("A");&#10;                Toast.makeText(getApplicationContext(), jsonArray.get(0).getAsString() + ": " + jsonArray.get(1).getAsString(), Toast.LENGTH_LONG).show();&#10;            }&#10;        });&#10;    }&#10;});</pre>
 </div> </div> </div> <div align="left" dir="ltr"> </div> <p>همانطور که مشاهده می‌کنید توسط قطعه کد زیر SKD مربوطه در نسخه‌های قدیمی اندروید نیز بدون مشکل کار خواهد کرد:</p> <div align="left" dir="ltr">
<pre language="Java" name="code">Platform.loadPlatformComponent( new AndroidPlatformComponent() );</pre>
 </div> <p>در ادامه توسط متد createHubProxy ارجاعی به هابی که در سمت سرور ایجاد کردیم، داده‌ایم: </p> <div align="left" dir="ltr">
<pre language="Java" name="code">HubProxy hub = connection.createHubProxy("ChatHub");</pre>
 </div> <p>در ادامه نیز توسط یک روال رویدادگردان وضعیت اتصال را چک کرده‌ایم. یعنی در زمان بروز خطا در نحوه ارتباط یک پیام بر روی صفحه نمایش داده می‌شود:</p> <div align="left" dir="ltr"> <div align="left" dir="ltr"> <div align="left" dir="ltr">
<pre language="Java" name="code">connection.error(new ErrorCallback() {&#10;    &#10;    @Override&#10;    public void onError(final Throwable error) {&#10;        runOnUiThread(new Runnable() {&#10;            public void run() {&#10;                Toast.makeText(getApplicationContext(), error.getMessage(), Toast.LENGTH_LONG).show();&#10;            }&#10;        });&#10;        &#10;    }&#10;});</pre>
 </div> </div> </div>
در ادامه نیز توسط کد زیر متد پویایی که در سمت سرور ایجاد کرده بودیم را جهت برقراری ارتباط با سرور اضافه کرده‌ایم: <div align="left" dir="ltr"> <div align="left" dir="ltr"> <div align="left" dir="ltr"> <div align="left" dir="ltr">
<pre language="Java" name="code">hub.subscribe(new Object() {&#10;    @SuppressWarnings("unused")&#10;    public void messageReceived(final String name, final String message) {&#10;        &#10;        runOnUiThread(new Runnable() {&#10;            public void run() {&#10;                Toast.makeText(getApplicationContext(), name + ": " + message, Toast.LENGTH_LONG).show();&#10;            }&#10;        });&#10;    }&#10;});</pre>
 </div> </div> </div> </div>
برای برقراری ارتباط نیز کدهای زیر را اضافه کرده‌ایم. یعنی به محض اینکه با موفقیت اتصال با سرور برقرار شد پیامی بر روی صفحه‌نمایش ظاهر می‌شود: <div align="left" dir="ltr"> <div align="left" dir="ltr"> <div align="left" dir="ltr">
<pre language="Java" name="code">connection.start()&#10;.done(new Action&lt;Void&gt;() {&#10;    &#10;    @Override&#10;    public void run(Void obj) throws Exception {&#10;        runOnUiThread(new Runnable() {&#10;            public void run() {&#10;                Toast.makeText(getApplicationContext(), "Done Connecting!", Toast.LENGTH_LONG).show();&#10;            }&#10;        });&#10;    }&#10;});</pre>
 </div> </div> </div>
در نهایت نیز برای نمایش اطلاعات دریافت شده کد زیر را نوشته‌ایم: <div align="left" dir="ltr"> <div align="left" dir="ltr"> <div align="left" dir="ltr">
<pre language="Java" name="code">connection.received(new MessageReceivedHandler() {&#10;    @Override&#10;    public void onMessageReceived(final JsonElement json) {&#10;        runOnUiThread(new Runnable() {&#10;            public void run() {&#10;                JsonObject jsonObject = json.getAsJsonObject();&#10;                JsonArray jsonArray =jsonObject.getAsJsonArray("A");&#10;                Toast.makeText(getApplicationContext(), jsonArray.get(0).getAsString() + ": " + jsonArray.get(1).getAsString(), Toast.LENGTH_LONG).show();&#10;            }&#10;        });&#10;    }&#10;});</pre>
 </div> </div> </div> <span style="line-height: 1.5em; font-size: 9pt;">همانطور که عنوان شد کدهای فوق دقیقاً براساس قواعد و دستورالعمل استفاده از SignalR در سمت کلاینت می‌باشد.</span> <br/> <p> <img src="/img/dntips/93a01c3acb9c0b3ed6fc.jpg" style="display:block; margin-left: auto; margin-right: auto;"/> </p> </div></div>
