当前位置: 首页 > news >正文

Java中初步使用websocket(springBoot版本)

一、什么是websocket

        WebSocket是一种在Web应用程序中实现实时双向通信的协议。它为浏览器和服务器之间提供了一种持久连接,在一个连接上可以双向传输数据。相比传统的HTTP协议,WebSocket具有更低的延迟和更高的效率。

        WebSocket使用了类似于握手的方式来建立连接。在握手过程中,浏览器和服务器会交换一些信息,以建立一个WebSocket连接。一旦连接建立,浏览器和服务器之间就可以实时地传输数据,而不需要每次都发起新的HTTP请求。

        WebSocket协议可以在不同的平台和编程语言中实现,包括Web浏览器和服务器端。在Web浏览器中,可以使用JavaScript中的WebSocket API来实现WebSocket连接。在服务器端,可以使用各种编程语言和框架来实现WebSocket服务器。

        WebSocket的应用场景非常广泛。它可以用于实时聊天应用、实时游戏、实时股票行情、实时协作编辑等需要实时通信的应用程序。通过WebSocket,开发人员可以更加方便地实现实时通信功能,提高用户体验。

        这里我们使用Java配合springboot2进行使用。

二、依赖坐标地址

1.springBoot父级依赖

<!--依赖的父级工程-->
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.6.6</version><relativePath/>
</parent>

2.springBoot依赖

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

3.webSocket依赖

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

三、代码 

        不多说了,直接拿去看吧,都在注释里面了。

服务器:

package com.blockchain.qgy.network.websocket;import com.blockchain.qgy.util.Strings;
import org.java_websocket.WebSocket;
import org.java_websocket.handshake.ClientHandshake;
import org.java_websocket.server.WebSocketServer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;import javax.annotation.PostConstruct;
import java.net.InetSocketAddress;
import java.util.ArrayList;
import java.util.List;@Component
public class P2pPointServer {//日志记录private Logger logger = LoggerFactory.getLogger(P2pPointServer.class);//本机的Server的WebSocket端口private Integer port = 7001;//所有连接到服务器的WebSocket缓存器private List<WebSocket> localSockets = new ArrayList<>();public List<WebSocket> getLocalSockets() {return localSockets;}public void setLocalSockets(List<WebSocket> localSockets) {this.localSockets = localSockets;}@PostConstruct@Order(1)public void initServer(){final WebSocketServer socketServer = new WebSocketServer(new InetSocketAddress(port)) {//创建链接成功时触发@Overridepublic void onOpen(WebSocket webSocket, ClientHandshake clientHandshake) {sendMessage(webSocket,"孩子们,我回来了!");localSockets.add(webSocket);}//断开连接时触发@Overridepublic void onClose(WebSocket webSocket, int i, String s, boolean b) {logger.info(webSocket.getRemoteSocketAddress() + "客户端与服务器断开连接");localSockets.remove(webSocket);}//接收到消息时触发@Overridepublic void onMessage(WebSocket webSocket, String s) {logger.info("收到了客户端的消息:" + s);sendMessage(webSocket,"孩子们,我收到消息了");}//连接发送错误时调用,后触发onClose方法@Overridepublic void onError(WebSocket webSocket, Exception e) {logger.info(webSocket.getRemoteSocketAddress() + "客户端与服务器连接发送错误");localSockets.remove(webSocket);}@Overridepublic void onStart() {logger.info("孩子们我要启动了!!");}};socketServer.start();logger.info("Man!what can I say,我已经启动了");}/*** 一对一发送* @param webSocket:客户端* @param message:信息*/public void sendMessage(WebSocket webSocket,String message){logger.info("发送给"+webSocket.getRemoteSocketAddress().getPort() + "的p2p消息是:" + message);webSocket.send(message);}/*** 一对多发送* @param message:信息*/public void broatcast(String message){if (localSockets.size() == 0 || Strings.isNullOrEmpty(message)) return;logger.info("张开第三只眼");for (WebSocket webSocket : localSockets){this.sendMessage(webSocket,message);}logger.info("孩子们我燃尽了");}
}

客户端:

package com.blockchain.qgy.network.websocket;import com.blockchain.qgy.util.Strings;
import org.java_websocket.WebSocket;
import org.java_websocket.client.WebSocketClient;
import org.java_websocket.handshake.ServerHandshake;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;import javax.annotation.PostConstruct;
import java.net.URI;
import java.util.ArrayList;
import java.util.List;@Component
public class P2pPointClient {//日志记录private Logger logger = LoggerFactory.getLogger(P2pPointClient.class);//服务器端的地址private String wsUrl = "ws://localhost:7001/";//所有连接到客户端的WebSocket缓存器private List<WebSocket> localSockets = new ArrayList<>();public List<WebSocket> getLocalSockets() {return localSockets;}public void setLocalSockets(List<WebSocket> localSockets) {this.localSockets = localSockets;}@PostConstruct@Order(2)public void connectServer(){try {final WebSocketClient socketClient = new WebSocketClient(new URI(wsUrl)) {@Overridepublic void onOpen(ServerHandshake serverHandshake) {sendMessage(this,"孩子们,我是客户端");localSockets.add(this);}@Overridepublic void onMessage(String s) {logger.info("收到服务器发来的信息:"+s);}@Overridepublic void onClose(int i, String s, boolean b) {logger.info("断开连接");localSockets.remove(this);}@Overridepublic void onError(Exception e) {logger.info("连接错误");localSockets.remove(this);}};socketClient.connect();} catch (Exception e) {e.printStackTrace();logger.info("连接错误");}}/*** 一对一发送* @param webSocket:客户端* @param message:信息*/public void sendMessage(WebSocket webSocket,String message){logger.info("发送给"+webSocket.getRemoteSocketAddress().getPort() + "的p2p消息是:" + message);webSocket.send(message);}/*** 一对多发送* @param message:信息*/public void broatcast(String message){if (localSockets.size() == 0 || Strings.isNullOrEmpty(message)) return;logger.info("张开第三只眼");for (WebSocket webSocket : localSockets){this.sendMessage(webSocket,message);}logger.info("孩子们我燃尽了");}
}

http://www.lryc.cn/news/529617.html

相关文章:

  • 2025年大年初一篇,C#调用GPU并行计算推荐
  • K8S ReplicaSet 控制器
  • FreeRTOS学习 --- 任务调度
  • 【小鱼闪闪】单片机开发工具——米思齐软件下载安装(图文)
  • MFC开发,给对话框添加垂直滚动条并解决鼠标滚动响应的问题
  • 动态规划DP 最长上升子序列模型 导弹防御模型(题目分析+C++完整代码实现)
  • LevelDB 源码阅读:写入键值的工程实现和优化细节
  • 药店药品销售管理系统的设计与实现
  • 人格分裂(交互问答)-小白想懂Elasticsearch
  • 【论文投稿-第八届智能制造与自动化学术会议(IMA 2025)】HTML, CSS, JavaScript:三者的联系与区别
  • python | OpenCV小记(一):cv2.imread(f) 读取图像操作(待更新)
  • 网络工程师 (9)文件管理
  • Java中的线程池参数(详解)
  • 2 MapReduce
  • 如何用函数去计算x年x月x日是(C#)
  • 开发过程中如何减少属性注释?
  • NX/UG二次开发—CAM—快速查找程序参数名称
  • socket实现HTTP请求,参考HttpURLConnection源码解析
  • 访问CMOS RAM
  • 解决AnyConnect开机自启动问题
  • 芯片AI深度实战:进阶篇之vim内verilog实时自定义检视
  • 数据结构实战之线性表(一)
  • jdk8项目升级到jdk17——岁月云实战
  • 商品列表及商品详情展示
  • 使用where子句筛选记录
  • SQL Server查询计划操作符(7.3)——查询计划相关操作符(5)
  • C++中常用的十大排序方法之4——希尔排序
  • 扶摇计划--从失业的寒冬,慢慢的走出来
  • unity学习24:场景scene相关生成,加载,卸载,加载进度,异步加载场景等
  • [cg] 使用snapgragon 对UE5.3抓帧