热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

spingboot集成okhttp实现websocket客户端实例

关于websocket服务端参见基于springboot实现最简单的websocket服务端实例,至于客户端的话,目前流行的是java-websocke

  关于websocket服务端参见基于springboot实现最简单的websocket服务端实例 ,至于客户端的话,目前流行的是java-websocket和okhttp框架,这里拿okhttp框架举个例子说说:

  1、引入okhttp:

com.squareup.okhttp3okhttp4.2.2

  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*/@Overridepublic 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());}}@Overridepublic 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;}}}@Overridepublic void onMessage(WebSocket webSocket, ByteString bytes) {super.onMessage(webSocket, bytes);}@Overridepublic void onClosing(WebSocket webSocket, int code, String reason) {super.onClosing(webSocket, code, reason);log.info("socket closing.");}@Overridepublic void onClosed(WebSocket webSocket, int code, String reason) {super.onClosed(webSocket, code, reason);log.info("socket closed.");}@Overridepublic 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,但随后就抽风挂掉了。


推荐阅读
  • Spring学习(4):Spring管理对象之间的关联关系
    本文是关于Spring学习的第四篇文章,讲述了Spring框架中管理对象之间的关联关系。文章介绍了MessageService类和MessagePrinter类的实现,并解释了它们之间的关联关系。通过学习本文,读者可以了解Spring框架中对象之间的关联关系的概念和实现方式。 ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 本文介绍了解决Netty拆包粘包问题的一种方法——使用特殊结束符。在通讯过程中,客户端和服务器协商定义一个特殊的分隔符号,只要没有发送分隔符号,就代表一条数据没有结束。文章还提供了服务端的示例代码。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • r2dbc配置多数据源
    R2dbc配置多数据源问题根据官网配置r2dbc连接mysql多数据源所遇到的问题pom配置可以参考官网,不过我这样配置会报错我并没有这样配置将以下内容添加到pom.xml文件d ... [详细]
  • 在springmvc框架中,前台ajax调用方法,对图片批量下载,如何弹出提示保存位置选框?Controller方法 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • 如何查询zone下的表的信息
    本文介绍了如何通过TcaplusDB知识库查询zone下的表的信息。包括请求地址、GET请求参数说明、返回参数说明等内容。通过curl方法发起请求,并提供了请求示例。 ... [详细]
  • SpringBoot整合SpringSecurity+JWT实现单点登录
    SpringBoot整合SpringSecurity+JWT实现单点登录,Go语言社区,Golang程序员人脉社 ... [详细]
  • 开发笔记:spring boot项目打成war包部署到服务器的步骤与注意事项
    本文介绍了将spring boot项目打成war包并部署到服务器的步骤与注意事项。通过本文的学习,读者可以了解到如何将spring boot项目打包成war包,并成功地部署到服务器上。 ... [详细]
author-avatar
小小蜘蛛侠
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有