哥哥手把手教你使用OKHttp3進行WebSocket長連接,忽略證書,完善SSL-HandShake問題

步驟一:

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

在項目中添加

implementation? ?'com.squareup.okhttp3:okhttp:3.8.1'

步驟二:

創(chuàng)建一個內(nèi)部類,集成okhttp中抽象類WebSocketListener?

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) {

? ? ?// ? logger.e("onMessage","onMessage: " + text);

? ? }

? ? @Override

? ? public void onMessage(WebSocket webSocket, ByteString bytes) {

?// ? logger.e("onMessage","onMessage: " + text);? ? }

? ? @Override

? ? public void onClosing(WebSocket webSocket, int code, String reason) {

? ? ?// ? webSocket.close(1000, null);

? ??// ? logger.e("onClosing","onClosing: " + reason);

? ? }

? ? @Override

? ? public void onClosed(WebSocket webSocket, int code, String reason) {

? ? ?// ? logger.e("onClosed","onClosed: " + reason);

? ? }

? ? @Override

? ? public void onFailure(WebSocket webSocket, Throwable t, Response response) {

? ? ???// ? logger.e("onFailure","onFailure: " + t.toString+response.toString);

? ? }

}

重寫了WebSocketListener中的幾個方法,這幾個方法很好理解,是用來異步回調(diào)的,這里簡單說一下:

onOpen當WebSocket和遠程建立連接時回調(diào);

兩個onMessage就是接收到消息時回調(diào),只是消息內(nèi)容的類型不同;

onClosing是當遠程端暗示沒有數(shù)據(jù)交互時回調(diào)(即此時準備關閉,但連接還沒有關閉,注意,此時并沒有關閉);

onClosed就是當連接已經(jīng)釋放的時候被回調(diào);

onFailure當然是失敗時被回調(diào)(包括連接失敗,發(fā)送失敗等)。

步驟三:

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();

}

如果打印成功,就說明整個簡單的流程走通啦。

如果這個時候出現(xiàn)SSL? HandShake的問題 ,那么你需要忽略證書:

public static OkHttpClient getUnsafeOkHttpClient() {

try {

final TrustManager[] trustAllCerts =new TrustManager[]{

new X509TrustManager() {

@Override

? ? ? ? ? ? ? ? ? ? public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) {

}

@Override

? ? ? ? ? ? ? ? ? ? public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) {

}

@Override

? ? ? ? ? ? ? ? ? ? public java.security.cert.X509Certificate[]getAcceptedIssuers() {

return new java.security.cert.X509Certificate[]{};

? ? ? ? ? ? ? ? ? ? }

}

};

? ? ? ? final SSLContext sslContext = SSLContext.getInstance("SSL");

? ? ? ? sslContext.init(null, trustAllCerts, new java.security.SecureRandom());

? ? ? ? final javax.net.ssl.SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();

? ? ? ? OkHttpClient.Builder builder =new OkHttpClient.Builder();

? ? ? ? builder.sslSocketFactory(sslSocketFactory);

? ? ? ? builder.hostnameVerifier(new HostnameVerifier() {

@Override

? ? ? ? ? ? public boolean verify(String hostname, SSLSession session) {

return true;

? ? ? ? ? ? }

});

? ? ? ? return builder.build();

? ? }catch (Exception e) {

throw new RuntimeException(e);

? ? }

}

將以上?OkHttpClient client = new OkHttpClient();

替換為OkHttpClient client =getUnsafeOkHttpClient();

即可運行

祝君好運

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • <!DOCTYPE html> 查看源 window.WRM=window.WRM||{};window....
    SMSM閱讀 927評論 1 0
  • WebSocket協(xié)議是一種建立在TCP連接基礎上的全雙工通信的協(xié)議。應用于即時通信等場景。 全雙工通信:客戶端和...
    fengfancky閱讀 7,161評論 1 1
  • 英文文檔,一開始我也是抗拒的,邊翻譯邊看,也就花費了1個小時基本就閱讀過了,我的英文基礎其實很差。附上鏈接:鏈接:...
    lonecolonel閱讀 10,438評論 3 1
  • 最近實際項目需要處理網(wǎng)絡請求(一般是個app都會有的),于是接觸了okhttp,目前也就剛剛會使用的程度,不...
    風二嘰閱讀 797評論 0 1
  • 這篇文章主要講 Android 網(wǎng)絡請求時所使用到的各個請求庫的關系,以及 OkHttp3 的介紹。(如理解有誤,...
    小莊bb閱讀 1,336評論 0 4

友情鏈接更多精彩內(nèi)容