sping boot集成okhttp實現websocket客戶端實例


  關於websocket服務端參見基於springboot實現最簡單的websocket服務端實例 ,至於客戶端的話,目前流行的是java-websocket和okhttp框架,這里拿okhttp框架舉個例子說說:

  1、引入okhttp:

        <dependency>
            <groupId>com.squareup.okhttp3</groupId>
            <artifactId>okhttp</artifactId>
            <version>4.2.2</version>
        </dependency>

 

  2、主要實現類繼承websocket監聽器:

package com.wlf.ws;

import com.alibaba.fastjson.JSONObject;
import com.wlf.entity.WSResponse;
import lombok.extern.slf4j.Slf4j;
import okhttp3.Response;
import okhttp3.WebSocket;
import okhttp3.WebSocketListener;
import okio.ByteString;

import java.io.IOException;

@Slf4j
public class SubTitleWS extends WebSocketListener {

    /**
     * websocket連接建立后來到這個方法
     *
     * @param webSocket
     * @param response
     */
    @Override
    public void onOpen(WebSocket webSocket, Response response) {
        super.onOpen(webSocket, response);

        // 打印連接建立后的響應
        try {
            log.info(response.body().string());
        } catch (IOException e) {
            log.error("call onOpen failed, error :{}", e.getMessage());
        }
    }

    @Override
    public void onMessage(WebSocket webSocket, String text) {
        super.onMessage(webSocket, text);

        log.info("receive=>" + text);

        //處理返回數據
        WSResponse response = (WSResponse) JSONObject.parse(text);

        if (response != null) {
            if (!"200".equals(response.getCode())) {
                log.error("code=> :{}, error=> :{}", response.getCode(), response.getMessage());
                return;
            }
        }
    }

    @Override
    public void onMessage(WebSocket webSocket, ByteString bytes) {
        super.onMessage(webSocket, bytes);
    }

    @Override
    public void onClosing(WebSocket webSocket, int code, String reason) {
        super.onClosing(webSocket, code, reason);
        log.info("socket closing.");
    }

    @Override
    public void onClosed(WebSocket webSocket, int code, String reason) {
        super.onClosed(webSocket, code, reason);
        log.info("socket closed.");
    }

    @Override
    public void onFailure(WebSocket webSocket, Throwable t, Response response) {
        super.onFailure(webSocket, t, response);
        if (response == null) {
            log.error("onFailure, response is null.");
            return;
        }
        try {
            log.error("onFailure, code: {}, errmsg: {}", response.code(), response.body().string());
        } catch (IOException e) {
            log.warn("onFailure failed, error: {}", e.getMessage());
        }
    }
}

 

  3、構造websocket客戶端請求:

package com.wlf.service;

import com.wlf.utils.MD5Util;
import com.wlf.ws.SubTitleWS;
import lombok.extern.slf4j.Slf4j;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.WebSocket;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.security.NoSuchAlgorithmException;

@Slf4j
@Service
public class LiveMixService {

    // websocket客戶端對象
    final OkHttpClient webSocketClient = new OkHttpClient.Builder().build();

    // websocket請求url
    @Value("${subTitleUrl}")
    private String subTitleUrl;

    @Value("${secret}")
    private String secret;

    /**
     * 發起字幕合成
     */
    public void liveMix(String liveId) throws NoSuchAlgorithmException {
        sendRequest(liveId);
    }

    /**
     * 發送websocket建立連接請求
     *
     * @param liveId
     */
    private void sendRequest(String liveId) throws NoSuchAlgorithmException {
        String seed = subTitleUrl + "?liveId=" + liveId + "+" + secret;
        String md5 = MD5Util.md5Sum(seed);
        String url = subTitleUrl + "?liveId=" + liveId + "&md5=" + md5;

        log.info("websocket url: {}", url);

        // 構造請求對象
        Request request = new Request.Builder().url(url).build();

        // 調用websocket服務端
        WebSocket webSocket = webSocketClient.newWebSocket(request, new SubTitleWS());
    }
}

 

 

  完事了,我們啟動運行下,看下客戶端連接服務端的日志:

2020-04-29 18:14:11 [http-nio-8089-exec-1] INFO  com.wlf.service.LiveMixService - websocket url: ws://100.100.10.110:8800/ws/subtitleConnect?liveId=1234&md5=6021b9576f99c883949fb0901a099218 
2020-04-29 18:15:12 [OkHttp http://100.100.10.110:8800/...] INFO  com.wlf.ws.SubTitleWS -  
2020-04-29 18:15:12 [OkHttp http://100.100.10.110:8800/...] INFO  com.wlf.ws.SubTitleWS - receive=>{"code":"200","message":"success"} 
2020-04-29 18:15:12 [OkHttp http://100.100.10.110:8800/...] ERROR com.wlf.ws.SubTitleWS - onFailure, response is null. 

 

  上面的日志發現連接是成功的,服務端在鏈接建立后返回了200,但隨后就抽風掛掉了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM