最通俗易懂的使用OkHttp進行WebSocket連接教程:上來直接擼代碼

本篇爲轉載!
原文出自我家豪哥的博客【還是choubuyao臉的稱呼】]
http://blog.csdn.net/xlh1191860939/article/details/75452342

最近在項目中需要用到WebSocket來處理持續連接(persistent connection)。以前在Android端只使用過Java原生的Socket但沒有使用過WebSocket,只知道OkHttp支持WebSocket。上網一搜,有些不是api太舊就是長篇大論不知所云,最終還是從國外兩篇博客中得到了啓發,:一篇是通過例子直接介紹使用,我決定先把這篇博客分享給大家,直接上手;另一篇博客的將以譯文的形式呈現給大家。

1. 新建項目,並在項目中添加OkHttp依賴:

compile ‘com.squareup.okhttp3:okhttp:3.8.1’

這裏注意一點,okhttp是3.5以後才添加對WebSocket的支持,以前都是提供了擴展庫okhttp-ws,建議使用3.5以上版本。

2. 添加網絡權限

<uses-permission  android:name="android.permission.INTERNET" />

3. 在MainActivity的佈局中添加如下代碼:

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <Button
    android:id="@+id/start"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="start"
    android:textSize="16sp" />

    <TextView
    android:id="@+id/text"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

    </LinearLayout>

點擊這個Button就建立連接,然後服務器返回的消息都顯示在下面的TextView上。

4. 然後就是常見的初始化控件,設置監聽:

public class MainActivity extends AppCompatActivity {

private Button start;
private TextView text;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    start = (Button) findViewById(R.id.start);
    text = (TextView) findViewById(R.id.text);

    start.setOnClickListener(new View.OnClickListener() {
     @Override
     public void onClick(View v) {
    }
});
}

5. 創建一個類,繼承OkHttp中的抽象類WebSocketListener(這裏爲了方便就此類作爲MainActivity的成員內部類):

private final class EchoWebSocketListener extends WebSocketListener {

@Override
public void onOpen(WebSocket webSocket, Response response) {

    webSocket.send("hello world");
    webSocket.send("welcome");
    webSocket.send(ByteString.decodeHex("adef"));
    webSocket.close(1000, "再見");
}

@Override
public void onMessage(WebSocket webSocket, String text) {
    output("onMessage: " + text);
}

@Override
public void onMessage(WebSocket webSocket, ByteString bytes) {
    output("onMessage byteString: " + bytes);
}

@Override
public void onClosing(WebSocket webSocket, int code, String reason) {
    webSocket.close(1000, null);
    output("onClosing: " + code + "/" + reason);
}

@Override
public void onClosed(WebSocket webSocket, int code, String reason) {
    output("onClosed: " + code + "/" + reason);
}

@Override
public void onFailure(WebSocket webSocket, Throwable t, Response response) {
    output("onFailure: " + t.getMessage());
}
}
  • 重寫了WebSocketListener中的幾個方法,這幾個方法很好理解,是用來異步回調的,這裏簡單說一下:onOpen當WebSocket和遠程建立連接時回調;兩個onMessage就是接收到消息時回調,只是消息內容的類型不同;onClosing是當遠程端暗示沒有數據交互時回調(即此時準備關閉,但連接還沒有關閉);onClosed就是當連接已經釋放的時候被回調;onFailure當然是失敗時被回調(包括連接失敗,發送失敗等)。

  • output方法的實現如下:

    private void output(final String content) {

    runOnUiThread(new Runnable() {
    @Override
    public void run() {
    text.setText(text.getText().toString() + content + “\n”);
    }
    });
    }

照着做,就是在TextView上顯示相關內容。具體後面一篇博文有相關解釋。

  • WebSocket的幾個方法:
    send用來發送消息;close用來關閉連接。不多說。

6. 處理start按鈕的點擊事件的邏輯,在這裏調用自定義connect方法:

start.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
    connect();
}
});

private void connect() {

EchoWebSocketListener listener = new EchoWebSocketListener();
Request request = new Request.Builder()
        .url("ws://echo.websocket.org")
        .build();
OkHttpClient client = new OkHttpClient();
client.newWebSocket(request, listener);

client.dispatcher().executorService().shutdown();
}

這裏吐槽一下:就是這裏的url,之前由於公司服務器那邊還沒處理好應對WebSocket連接,差點都自己搭服務器了,後來發現WebSocket官網就提供了相應url可以測試。

7. 運行程序,點擊按鈕,最終結果如下:
這裏寫圖片描述

本文參考文章:
http://www.ssaurel.com/blog/learn-to-use-websockets-on-android-with-okhttp/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章