SpringBoot+Vue实现Websocket通信及Java实现客户端

SpringBoot+Vue3实现websocket 再创建一个处理器类,我在这里设置了一个静态变量,可以直接调用这个静态变量来发送消息。vue3,接收后端发送的请求,路径一定要和后台的路径一致。 阅读详情
AI摘要

本文介绍了如何使用WebSocket在Spring Boot后端创建一个实时推送系统,包括服务端的配置和客户端的Java与Vue实现。通过WebSocket,服务端能主动向客户端推送数据,打破轮询限制。

目录

使用场景

原理和知识点

Java代码实现

服务端实现

Java实现客户端

Vue代码实现

总结


使用场景

希望做一个能够替代轮询的大屏后台系统,可以向多个客户端主动推送更改数据,而非轮询请求。

原理和知识点

WebSocket理解

看完让你彻底理解 WebSocket 原理

Http、Socket、WebSocket之间联系与区别

WebSocket介绍和Socket的区别

Websocket原理及基本属性和方法

上面的博客讲了一些基本的概念原理和理解,例子也比较容易理解,有时间可自行查看,不想看直接向下看代码。

说一下个人的理解,仅供参考(与Http作比较):

  • WebSocket类似于Http,都是一种可靠性传输协议,就是用来传输通信的。

  • 但是Http是短连接,每次连接完成后都需要断开,第二次连接时需要重新请求;而WebSocket则是连接一次后,便可以持久通信的,这也是两者最大的区别。

  • 同时Http只支持请求-回复,服务端不能主动向客户端发送消息,而WebSocket则可以双向通信(全双工)。

  • 总的来说就是,WebSocket可以用来通信,一次连接后即可实现持久性双向通信。


Java代码实现

服务端实现

知识点了解后,还不来两行代码过过瘾?废话不多说,上码!

万事先依赖:

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-websocket</artifactId>
        </dependency>

首先,我们先配置WebSocketConfig,配置ServerEndpointExporter去查找带有@ServerEndPoint注解的服务类。

@Configuration
public class WebSocketConfig {
​
    @Bean
    public ServerEndpointExporter serverEndpointExporter(){
        return new ServerEndpointExporter();
    }
}

然后,编写WebSocketServer服务类,添加上注解@ServerEndPoint(“/自定义地址”)(表明这是WebSocket的服务类)和@Component(注入容器)。

同时需要声明以下监听方法:

  • @OnOpen,当有客户端连接时触发

  • @OnClose,当有客户端关闭时触发

  • @OnMessage,当收到客户端消息时触发

  • @OnError,当通信发生错误时触发

@Component
@ServerEndpoint("/websocket/{userName}")
public class WebSocketServer {
​
    private static final Logger logger = LoggerFactory.getLogger(WebSocketServer.class);
    //在线客户端数量
    private static int  onlineCount = 0;
    //Map用来存储已连接的客户端信息
    private static ConcurrentHashMap<String, SocketDomain> websocketMap = new ConcurrentHashMap<>();
    //当前连接客户端的Session信息
    private Session session;
    //当前客户端名称
    private String userName="";
    
    @OnOpen
    public void onOpen(Session session, @PathParam("userName") String userName){
        if(!websocketMap.containsKey(userName)){
            WebSocketServer.onlineCount++;
        }
        this.session = session;
        this.userName = userName;
        SocketDomain socketDomain = new SocketDomain();
        socketDomain.setSession(session);
        socketDomain.setUri(session.getRequestURI().toString());
        websocketMap.put(userName, socketDomain);
        logger.info("用户连接:"+ userName + ",人数:"+onlineCount);
        try {
            sendMessage("连接成功");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    @OnClose
    public void onClose(){
        if(websocketMap.containsKey(userName)){
            websocketMap.remove(userName);
            onlineCount--;
            logger.info("用户关闭:"+ userName + ",人数:"+onlineCount);
        }
    }
​
    @OnMessage
    public void onMessage(String message,Session session){
        if(StringUtil.isNotEmpty(message)){
            logger.info("收到用户消息:"+userName+",报文:"+message);
        }
    }
​
​
​
    //给当前客户端发消息
    private void sendMessage(String obj) {
        synchronized (session) {
            this.session.getAsyncRemote().sendText(obj);
        }
    }
​
​
​
    //给指定客户端发送消息,通过UserName找到Session发送
    private void sendMessageTo(String userName,String obj){
        SocketDomain socketDomain = websocketMap.get(userName);
        try {
            if(socketDomain !=null){
                socketDomain.getSession().getAsyncRemote().sendText(obj);
            }
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e.getMessage());
        }
    }
    //给除了当前客户端的其他客户端发消息
    private void sendMessageToAllExpectSelf(String message, Session fromSession) {
        for(Map.Entry<String, SocketDomain> client : websocketMap.entrySet()){
            Session toSeesion = client.getValue().getSession();
            if( !toSeesion.getId().equals(fromSession.getId())&&toSeesion.isOpen()){
                toSeesion.getAsyncRemote().sendText(message);
                logger.info("服务端发送消息给"+client.getKey()+":"+message);
            }
        }
    }
    //给包括当前客户端的全部客户端发送消息
    private void sendMessageToAll(String message){
        for(Map.Entry<String, SocketDomain> client : websocketMap.entrySet()){
            Session toSeesion = client.getValue().getSession();
            if(toSeesion.isOpen()){
                toSeesion.getAsyncRemote().sendText(message);
                logger.info("服务端发送消息给"+client.getKey()+":"+message);
            }
        }
    }
    //给外部调用的方法接口
    public void sendAll(String Message){
        sendMessageToAll(Message);
    }
​
​
}
​​​​​​​@Data
public class SocketDomain {
​
    private Session session;
​
    private String uri;
}

以上,服务端就写好了。WebSocket在线测试地址可以通过这个网站来测试自己的服务是否正常。

服务端OK后,就是实现客户端了,分别是java版本和Vue版本。Html和Vue差不多,可以自行编写和查找。


Java实现客户端

还是那句话,万事先依赖:

<dependency>
    <groupId>org.java-websocket</groupId>
    <artifactId>Java-WebSocket</artifactId>
    <version>1.4.0</version>
</dependency>

然后,编写客户端:

//继承WebSocketClient,重写监听方法和构造方法
public class MyWebSocketClient extends WebSocketClient {
    private static final Logger logger = LoggerFactory.getLogger(MyWebSocketClient.class);
​
    public MyWebSocketClient(URI serverUri){
        super(serverUri);
    }
    @Override
    public void onOpen(ServerHandshake serverHandshake) {
        logger.info("客户端和ws服务已经连接上了");
    }
​
    @Override
    public void onMessage(String s) {
        logger.info("收到服务器消息:"+ s);
    }
​
    @Override
    public void onClose(int i, String s, boolean b) {
        logger.info("客户端和服务端连接关闭");
        logger.info(String.valueOf(i));
        logger.info(s);
        logger.info(String.valueOf(b));
    }
​
    @Override
    public void onError(Exception e) {
        logger.info("通信发生错误");
    }
}

很简单,客户端已经写完了,但是总的让客户端和服务端连起来,所以,写个测试类:

这里有两点需要注意,很多人没有myWebSocketClient.connect();这一句,但是我自己测试发现,没有这一句连接是无法连接上的,于是我去构造函数里看了下,果真没发现有连接的方法,所以这个地方我添加了connect方法。(还有一个ConnectBlocking,里面包含了connect方法并返回布尔类型状态,所以效果一样,close方法相似)

还有一个地方需要注意,在客户端连接时,可能会存在延迟,如果客户端还没有连接上时就直接send,是会报错的,所以,我们先需要确保与服务端连接上再进行发送。

@RestController
public class WebSocketController {
​
    @GetMapping("/websocket/main")
    public void main() throws URISyntaxException, InterruptedException {
        MyWebSocketClient myWebSocketClient    = new MyWebSocketClient(new URI("ws://上面自定义的服务端地址"));
        //主动与服务端连接
        myWebSocketClient.connect();
        //确保与服务端连接上,再进行下一步
        while(!myWebSocketClient.getReadyState().equals(ReadyState.OPEN)){
            System.out.println("连接中。。。");
        }
        //给服务端发消息
        myWebSocketClient.send("我是Java客户端");
        //        关闭客户端
        //        myWebSocketClient.close();
        //        Thread.sleep(3000);
        //        System.out.println(myWebSocketClient.getReadyState());
    }
}

然后启动服务,发个消息试试吧。

客户端日志:

连接中。。。 2022-01-08 14:54:49.924 INFO 18124 --- [ctReadThread-37] c.e.t.Controller.MyWebSocketClient       : 客户端和ws服务已经连接上了 2022-01-08 14:54:49.925 INFO 18124 --- [ctReadThread-37] c.e.t.Controller.MyWebSocketClient       : 收到服务器消息:连接成功

服务端日志:

2022-01-08 14:54:49.921 INFO 6636 --- [io-8087-exec-10] c.e.testdemo2.WebSocket.WebSocketServer : 用户连接:main,人数:2 2022-01-08 14:54:49.926 INFO 6636 --- [nio-8087-exec-2] c.e.testdemo2.WebSocket.WebSocketServer : 收到用户消息:main,报文:我是Java客户端

以上,连接且通信成功!

Vue代码实现

Vue实现客户端

可以先看WebSocket API,写的也挺清楚的,具体代码直接贴了!

<template>
<button @click="webclick">给后台发送消息</button>
</template>
​
<script>
export default {
    name: "web2",
    data() {
        return {
            ws: null
        }
    },
    created() {
        //连接WebSocket服务端,然后初始化监听事件
        this.ws = new WebSocket("ws://localhost:8087/websocket/test");
        this.wsInit();
​
    },
    methods: {
        wsInit() {
            
            this.ws.onopen = () => {
                this.ws.send("服务已连接");
                console.log(this.ws.readyState)
            }
            this.ws.onclose = () => {
                console.log("服务器关闭")
                console.log(this.ws.readyState)
            }
            this.ws.onmessage = (message) => {
                console.log("收到服务器消息")
                console.log(message)
                console.log(this.ws.readyState)
            }
            this.ws.onerror = (error) => {
                console.log("报错了")
                console.log(error)
                console.log(this.ws.readyState)
            }
            
        }
    }
}
</script>
​

输出日志:

 

这种写法是比较简单的写法,还有一个稍微复杂的写法,添加监听事件,功能相似,但是更能让人理解。可以进入WebSocket类里查看或者可看springboot+vue实现Websocket这篇博客,我上面的服务端和vue客户端都是借鉴的这个博客写的。

总结

多个客户端和服务器

先看日志:

服务端发送日志:

Java客户端接受日志:

Vue客户端接收日志:

 

再看vue客户端发送日志:

再看服务端接收日志消息:

java客户端效果类似,不再重复看了!


以上总结:WebSocket支持客户端和服务端双向通信;服务端不仅可以指定发送给某一个客户端,可以群发给客户端,实现广播效果。而且连接后,可以持久性通信,不论是对于聊天通信等场景还是替换前端轮询请求都是一种很好的解决方案

最后,再推荐一个不错的代码博客WebSocket群聊(HTML前端写的简单界面,可以了解一下)。

🙉愿猿圆缘,愿猿圆愿🙈

 

Java客户端调用Websocket服务端,基于Springboot WebSocket服务端 创建Springboot工程,引入WebSocket依赖 配置WebSocketConfig 配置WebSocketServer Java客户端 创建Springboot工程,引入java客户端依赖 配置JavaClient 创建连接 测试效果 阅读详情

相关推荐

基于Vue+SpringBoot+WebSocket实现Web端聊天系统(包含网络通信+心跳+客户端服务端+后端,采用java+mysql实现)

通过前后端分离的方式和WebSocket协议的应用,系统实现了用户注册与登录、聊天功能、心跳机制、用户管理和聊天记录查询等功能。后端:采用SpringBoot框架,SpringBoot简化了Spring应用的初始搭建以及开发过程,通过约定优于配置的理念,让开发者能够更快地构建出生产级别的Spring应用。系统采用前后端分离的方式,前端负责用户界面的展示和交互,后端负责业务逻辑的处理和数据的存储。聊天功能:用户可以在聊天室中进行私聊和群聊,前端负责发送消息和接收消息,后端负责消息的转发和存储。

白话机器学习 2347

java web vue_Vue+Java 通过websocket实现服务器与客户端双向通信-Go语言中文社区

1. vue代码methods: {//在方法里调用 this.websocketsend()发送数据给服务器onConfirm () {//需要传输的数据let data = {code: 1,item: ‘传输的数据’}this.websocketsend(JSON.stringify(data))},/**/initWebSocket () { // 初始化weosocketlet use...

weixin_33739480的博客 364

web网页端使用webSocket实现语音通话功能(SpringBoot+VUE)

最近在写一个web项目,需要实现web客户端之间的语音通话,期望能够借助webSocket全双工通信的方式来实现,但是网上没有发现可以正确使用的代码。网上能找到的一个代码使用之后只能听到“嘀嘀嘀”的杂音使用Json来传递数据代替原有的二进制输入输出流技术栈:VUE3、SpingBoot、WebSocket。

m0_74823892的博客 1333

java写一个webrtc信令服务器,coturn

java写一个webrtc信令服务器,coturn

weixin_45029766的博客 8652

websocket 实现后端主动前端推送数据、及时通讯(vue3 + springboot)

WebSocket 是一种全双工通信协议,用于在 Web 浏览器和服务器之间建立持久的连接。WebSocket 协议由 IETF 定为标准,WebSocket API 由 W3C 定为标准。一旦 Web 客户端与服务器建立连接,之后的全部数据通信都通过这个连接进行。可以互相发送 JSON、XML、HTML 或图片等任意格式的数据。都是基于 TCP 的应用层协议。都使用 Request/Response 模型进行连接的建立。可以在网络中传输数据。

m0_48853274的博客 1万+

SpringBoot实现STOMP协议下的WebSocket

文章目录WebSocket简介STOMP简介上去就是干环境配置引入依赖新建WebSocket配置类新建保存用户认证信息的实体类MyPrincipalHandshakeHandler握手拦截器WebSocketHandshakeInterceptor消息通道拦截器服务端消息处理器广播式消息点对点式消息前端VUE实现 WebSocket简介 WebSocket 是 HTML5 开始提供的一种在单个 T...

weixin_40693633的博客 1万+

vue+Spring Boot 使用WebSocket

WebSocket 原理:WebSocket 是一种全双工协议,建立连接后,客户端和服务器之间可以实时、双向地交换数据。它基于 HTTP 协议的升级机制,通过一个握手过程,客户端与服务器建立 WebSocket 连接,并且后续通信无需重新建立连接。Java 服务端:Spring Boot 提供了对 WebSocket 的内建支持,我们通过注解来处理客户端发送的消息,使用来推送消息到订阅的客户端。Vue 客户端:Vue 客户端使用SockJS和Stomp.js。

yjh_OK的博客 1417

基于Vue+SpringBoot+WebSocket实现的Web端聊天系统(包含网络通信+心跳+客户端服务端+mysql)

基于Vue、SpringBoot和WebSocket技术的Web端聊天系统,旨在实现一个高效、实时且互动性强的在线聊天平台。该系统通过前后端分离的方式开发,前端采用Vue框架结合ElementUI进行页面布局和样式设计,后端则使用SpringBoot框架进行业务逻辑处理,并利用WebSocket技术实现实时通信。此外,系统使用MySQL数据库进行数据存储,确保数据的持久性和安全性。

白话机器学习 1573

Springboot整合WebSocket,实现服务端主动向客户端推送数据

Springboot整合WebSocket,实现服务端主动向客户端推送数据 1.对于WebSocket、Socket、Http三者的理解 Socket(长连接,一直连接,资源耗费大): 所谓套接字(Socket),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象 一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制 从所处的地位来讲,套接字上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通信的接口,是应用程序与网络协议根进行交互的接口 Http: 超文本传输协

Hello World 3181

Vue+Java 通过websocket实现服务器与客户端双向通信操作

主要介绍了Vue+Java 通过websocket实现服务器与客户端双向通信操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

智能车竞赛卡丁快跑组:自动驾驶与人车交互技术实战解析

本文深入解析了智能车竞赛卡丁快跑组的技术核心,重点探讨了自动驾驶与人车交互两大模块的实战方案。文章详细拆解了从环境感知、路径规划到语音识别、命令执行的完整流程,并分享了基于单片机平台的调试心法与赛场经验,为参赛者提供了一套从零开始、分步攻坚的系统性备赛指南。

f0g1h2的博客 1177

WebSocket实现在线聊天

WebSocket实现在线聊天 前两天在公司接到一个需求,使用WebSocket实现微信扫码登陆,当时了解了一下WebSocket,都说WebSocket可以实现在线聊天,所以我自己也写了一个。(发个帖子证明我还活着????) 简单介绍下什么是WebSocket。 我们的都知道,前端向后端发起请求一般都是使用的Http协议,但是呢Http协议有一个不好的地方那就是,只能由客户端主动发起请求,服务器收到客户端的请求后才会返回结果数据。这种单向请求的特点,就造就了一个问题,如果服务器端数据发生了变化,客户

啥也不会的程序员 1947

NC数据预处理避坑指南:从MATLAB读取到GeoTIFF导出,解决坐标翻转与值域异常

本文详细解析了NC数据预处理中的常见问题,包括MATLAB读取时的坐标翻转与GeoTIFF导出时的值域异常。通过实战案例,介绍了如何解决矩阵方向错乱、处理FillValue与scale_factor、精准移植空间参考等关键问题,帮助研究者高效完成气象数据的批量处理与GIS兼容性验证。

weixin_30788619的博客 653

vue-springboot:webSocket的使用,同步购物车实例

websocket的实现+代码,亲测可用

荼蘼_的博客 1188

STM32 ST-LINK Utility固件烧录全流程详解与实战技巧

本文详细解析了使用STM32 ST-LINK Utility进行固件烧录的全流程与实战技巧。从硬件连接、软件安装、核心三步操作(连接、擦除、烧录)到进阶的选项字节配置与批量脚本烧录,提供了完整的避坑指南和问题排查方案,帮助开发者高效完成STM32程序下载。

lambda的博客 768

Visual MODFLOW Flex 6.1新手入门:从数据导入到3D建模的完整工作流解析

本文为Visual MODFLOW Flex 6.1新手提供了从零开始构建地下水数值模型的完整工作流指南。详细解析了从项目规划、数据准备与导入,到构建三维概念模型、生成并运行数值模型,直至结果可视化与校准的核心步骤。帮助水文地质与环工领域初学者快速掌握这一专业软件,高效完成从数据到三维建模的全过程。

a1b2c的博客 800

vue3+springboot基于Android的音乐点歌系统 在线唱歌系统设计与实现

"的Toast消息。作为主要的数据存储解决方案,使用 MySQL 数据库与后端服务进行集成,通过 Spring Boot 的数据访问技术来简化与 MySQL 数据库的交互,确保数据的安全性和一致性。(5)写Controller.java,连接页面请求和服务层,获取页面请求的参数,通过自动装配,映射不同的URL到相应的处理函数,并获取参数,对参数进行处理,之后传给服务层。维护:android系统的更新总是很快,而且不总是向后兼容的,所以设计一个程序并不难,如何让它适应不同版本的os是有难度的。

qq_840612233的博客 301

App inventor2通过蓝牙控制Arduino Uno LED开关

App inventer2控制Arduino Uno LED开关 如果学会这个小程序,大部分的手机通过蓝牙控制Arduino的功能都可以实现,这个小示例是通过蓝牙模块向Arduino发送"0"和"1",而其它功能要发送其它不同的字符串内容给Arduino. 所需硬件: Arduino Uno JDY-16 蓝牙模块(我的是蓝牙4.2版本) 草帽LED(可选) 手机(我用的是安卓,苹果手机应该也可以,最近其应用商店也有App inventor(AI)伴侣) 软件: Aduino IDE或者Platfom

Firmin123456的博客 5498

SpringBoot(java)实现websocket实现实时通信

WebSockets是一种在Web应用程序中实现实时通信的技术。它允许客户端和服务器之间建立持久的、双向的通信通道,从而使得服务器可以实时向客户端推送数据,而不需要客户端不断地向服务器发起请求。这种实时通信的能力对于需要即时更新数据的应用程序非常有用,比如在线聊天应用、实时游戏、股票市场更新等。:客户端向服务器发起WebSocket连接请求,服务器接受连接请求后,双方建立WebSocket连接。:一旦建立了连接,客户端和服务器就可以通过该连接进行双向通信,可以发送和接收数据。

敲厉害的燕宝的博客 3880

11、ThingsBoard集群部署k8s

今天终于有时间去搞这个啦,拖了很久了,一直没时间,因为我本地没有那么多机器资源,开虚拟机不够,如果租用阿里云服务器,需要有充值的时间,因为这个费用是按小时付费,需要有连贯的时间来搞才行,今天恰好有时间,就开始搞了,弄成功搞出来了,特地写博客记录下来。

AldrichEugene 990

Altium Designer(AD24/25)如何在PCB设计阶段做阻抗匹配

目前阻抗匹配多直接有制版厂进行,PCB设计师在设计阶段可不关注阻抗设计,在加工阶段只需标注需要控制的阻抗线,制板厂即可按照要求对阻抗线进行调整和控制。但是对于设计师来讲掌握阻抗线的设计方法也是非常必要的。本文介绍Altium Designer(AD24/25)如何在PCB设计阶段做阻抗匹配。

fydar的博客 893

SpringBoot2.0集成WebSocket,实现后台向前端推送信息

什么是WebSocket? - 初次接触 WebSocket 的人,都会问同样的问题:我们已经有了 HTTP 协议,为什么还需要另一个协议?它能带来什么好处? - 答案很简单,因为 HTTP 协议有一个缺陷:***通信只能由客户端发起***,HTTP 协议做不到服务器主动向客户端推送信息。 https://github.com/moshowgame/spring-cloud-study/tree/master/spring-cloud-study-websocket

★【World Of Moshow 郑锴】★ 46万+

自学 ABAP 和自学 SAP 的差别

有朋友在我的 ABAP 学习教程里留言: > 自学SAP是不是都要搭建虚拟服务器,然后自己去官网下载新版本SAP就可以吗 对于初学者,我们要搞清楚 ABAP 和 SAP 的区别。 ABAP 是一门编程语言,SAP 首先是德国软件公司的名称,也代表这家公司开发的一系列软件。SAP 公司开发的软件,我们有时也称产品,其功能能满足客户一个或者多个领域的业务需求。这些不同领域,我们也称为不同的业务模块,比如 ERP,CRM,SRM,HR 等等。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 6862

Vue + SpringBoot实现WebSocket通信

Vue + SpringBoot实现WebSocket通信 原文地址 服务端 在SpringBoot项目中添加ServerEndpointExporterBean的方法 @Bean public ServerEndpointExporter exporter(){ return new ServerEndpointExporter(); } 创建WebSocket客户端管理类: W...

CarolRain的博客 796

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

vue中使用WebSocket与java SpringBoot进行交互实现聊天室

一、简单介绍下HTML5 WebSocket WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。 WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。 在 WebSocket API ...

web小袋鼠 8533

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

WebSocket实现多人聊天页面-详解(Vue+SpringBoot)

本文介绍了一个基于Vue+SpringBoot的WebSocket实时聊天应用。系统采用STOMP协议实现双向通信,包含服务端的会话管理、消息处理和客户端交互功能。服务端通过SpringBoot实现WebSocket配置、消息控制器和事件监听器;客户端使用Vue.js构建,支持昵称设置、消息收发和实时显示。项目实现了完整的WebSocket通信流程,包括连接建立、消息广播和会话管理,为开发者提供了一个完整的实时聊天应用参考实现。

2401_84926677的博客 2159

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

上一篇: 日常Bug—盘符问题
下一篇: 枚举类的定义和使用
黄焖大排骨
博客等级 码龄8年 52粉丝 19原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值