کانال بله, جهت پشتیبانی و اطلاع رسانی کانال بله, جهت پشتیبانی و اطلاع رسانی
عضویت

آموزش استفاده از WebSocket ها در Android با استفاده از OkHttp

آموزش استفاده از بارکد و QR code scanner دراندروید با کمک Google Mobile Vision در Android

همانطور که می دانید، WebSocket یک پروتکل ارتباطی کامپیوتری است، که در یک تک اتصال TCP کانال های ارتباطی کاملا دو رشته ای را فراهم میکند. WebSocket در HTML 5 پشتیبانی می شود. با توجه به اینکه ورژن کتابخانه ی OkHttp 3.5 است، می توانید در برنامه های اندرویدی خود از اتصال WebSocket ها نیز استفاده کنید. در این آموزش شما چگونگی ایجاد یک نرم افزار چت ساده را با استفاده از Echo WebSocket Server که در آدرس زیر موجود است، خواهید آموخت.
توجه داشته باشید این آموزش در یوتیوب نیز موجود است.
اولین گام، اضافه کردن وابستگی OkHttp در فایل Gradle build تان است.

compile 'com.squareup.okhttp3:okhttp:3.6.0'

به خاطر داشته باشید که حتما Internet permission را در Android manifest تان اضافه کنید. زیرا این برنامه برای ایجاد اتصال WebSocket به سرور Echo WebSocket از شبکه استفاده می کند. در این آموزش به یکlayout ساده نیاز داریم که در آن برای شروع اتصال و تبادل با سرور دکمه ای به کار رفته است. همچنین از یک TextView استفاده خواهیم کرد که به عنوان یک console output برای پیام های دریافت شده از سرور استفاده می شود.

< ?xml version="1.0" encoding="utf-8"? >
< RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
  android:id="@+id/activity_main"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:paddingBottom="@dimen/activity_vertical_margin"
  android:paddingLeft="@dimen/activity_horizontal_margin"
  android:paddingRight="@dimen/activity_horizontal_margin"
  android:paddingTop="@dimen/activity_vertical_margin"
  tools:context="com.ssaurel.websocket.MainActivity" >
  < Button
    android:id="@+id/start"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerHorizontal="true"
    android:text="Start !"
    android:layout_marginTop="40dp"
    android:textSize="17sp"/ >
  < TextView
    android:id="@+id/output"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@id/start"
    android:layout_centerHorizontal="true"
    android:textSize="16sp"
    android:layout_marginTop="30dp"/ >
< /RelativeLayout >

سپس می توانیم کد جاوای برنامه را بنویسیم. بخش اصلی این کد متدی است که برای ایجاد اتصال به WebSocket connection استفاده می شود، همچنین شیء WebSocketListener ای که کار تبادل با سرور را برعهده دارد.

private final class EchoWebSocketListener extends WebSocketListener {
  private static final int NORMAL_CLOSURE_STATUS = 1000;
  @Override
  public void onOpen(WebSocket webSocket, Response response) {
    webSocket.send("Hello, it's SSaurel !");
    webSocket.send("What's up ?");
    webSocket.send(ByteString.decodeHex("deadbeef"));
    webSocket.close(NORMAL_CLOSURE_STATUS, "Goodbye !");
  }
  @Override
  public void onMessage(WebSocket webSocket, String text) {
    output("Receiving : " + text);
  }
  @Override
  public void onMessage(WebSocket webSocket, ByteString bytes) {
    output("Receiving bytes : " + bytes.hex());
  }
  @Override
  public void onClosing(WebSocket webSocket, int code, String reason) {
    webSocket.close(NORMAL_CLOSURE_STATUS, null);
    output("Closing : " + code + " / " + reason);
  }
  @Override
  public void onFailure(WebSocket webSocket, Throwable t, Response response) {
    output("Error : " + t.getMessage());
  }
}

ارسال پیام ها در متد onOpen انجام می شود. پیام های دریافتی از سرور Echo WebSocket درون متد onMessage نمایش داده می شوند. در نظر داشته باشید که پیام ها می توانند به صورت متنی یا پیام های شانزده شانزدهی نیز باشند. در نهایت با استفاده از متد close مربوط به شیء WebSocket اتصال را می بندیم. برای ایجاد اتصال WebSocket به کمک OkHttp نیاز است که با استفاده از URL سرور Echo WebSocket یک شیء در خواستی را (Request object) درون پارامتر بسازیم. سپس متد newWebSocket مربوط به شیء OkHttpClient را فراخوانی کنیم.
این کد باید به شکل زیر باشد:


package com.ssaurel.websocket;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import okhttp3.WebSocket;
import okhttp3.WebSocketListener;
import okio.ByteString;
public class MainActivity extends AppCompatActivity {
  private Button start;
  private TextView output;
  private OkHttpClient client;
  private final class EchoWebSocketListener extends WebSocketListener {
    private static final int NORMAL_CLOSURE_STATUS = 1000;
    @Override
    public void onOpen(WebSocket webSocket, Response response) {
      webSocket.send("Hello, it's SSaurel !");
      webSocket.send("What's up ?");
      webSocket.send(ByteString.decodeHex("deadbeef"));
      webSocket.close(NORMAL_CLOSURE_STATUS, "Goodbye !");
    }
    @Override
    public void onMessage(WebSocket webSocket, String text) {
      output("Receiving : " + text);
    }
    @Override
    public void onMessage(WebSocket webSocket, ByteString bytes) {
      output("Receiving bytes : " + bytes.hex());
    }
    @Override
    public void onClosing(WebSocket webSocket, int code, String reason) {
      webSocket.close(NORMAL_CLOSURE_STATUS, null);
      output("Closing : " + code + " / " + reason);
    }
    @Override
    public void onFailure(WebSocket webSocket, Throwable t, Response response) {
      output("Error : " + t.getMessage());
    }
  }
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    start = (Button) findViewById(R.id.start);
    output = (TextView) findViewById(R.id.output);
    client = new OkHttpClient();
    start.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View view) {
        start();
      }
    });
  }
  private void start() {
    Request request = new Request.Builder().url("ws://echo.websocket.org").build();
    EchoWebSocketListener listener = new EchoWebSocketListener();
    WebSocket ws = client.newWebSocket(request, listener);
    client.dispatcher().executorService().shutdown();
  }
  private void output(final String txt) {
    runOnUiThread(new Runnable() {
      @Override
      public void run() {
        output.setText(output.getText().toString() + "\n\n" + txt);
      }
    });
  }
}

در نهایت، تنها کافیست برنامه ی خود را اجرا کرده و از نتیجه لذت ببرید.


دوره آموزش Android FireBase Socket

برای مطالعه سرفصل آموزش جامع و عملی برنامه نویسی Android کلیک نمایید .

1397/05/27 6469 1706
رمز عبور : tahlildadeh.com یا www.tahlildadeh.com
نظرات شما

نظرات خود را ثبت کنید...