步驟一:
注意,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();
即可運行
祝君好運