这里只介绍大致实现步骤 细节没有具体 需根据真实操作环境完善细节
第一步:初始化一个SpringBoot工程(配置好需要的乱八七糟的东西,例如mybatis等等,因为这里主要讲WebSocket的使用,所以这块就不太详细说了)
第二步:导入依赖
pom.xml 添加如下依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> <version>2.3.2.RELEASE</version> </dependency>
第三步:创建一个WebSocket的配置类
因为我们创建的springboot工程 ,使用的是内置tomcat 所以需要做以下配置
@Configuration public class WebSocketConfig { @Bean public ServerEndpointExporter serverEndpointExporter() { return new ServerEndpointExporter(); } }
第四步:创建一个WebScoket实例
@ServerEndpoint("/websocket/{userid}") @Component @Slf4j public class PmWebSocket { //保存在线用户id以及对应客户端 public static Map<String, PmWebSocket> onlineUsers = new ConcurrentHashMap<>(); /** * 用来给客户端发送消息 */ private Session session; /** * 连接建立成功调用的方法 */ @OnOpen public void onOpen(Session session,@PathParam("userid") String userid) { this.session=session; log.info(userid+"连接成功");
//将用户id和socket对象保存 onlineUsers.put(userid,this); } /** * 连接关闭调用的方法 */ @OnClose public void onClose() { System.out.println("有一连接关闭"); } /** * 收到客户端消息后调用的方法 * * @param message 客户端发送过来的消息 */ @OnMessage public void onMessage(String message, Session session) { System.out.println("来自客户端的消息:" + message); }
/**
*发送消息方法
*/ private void broadcastMsgToAllOnlineUsers(String message) { //根据用户id获取socket对象 这里userid就是上面连接时候的用户id 具体怎么传过来怎么操作 思路很多 你们自己想个思路
//如果是聊天室的话 就要把这个消息发送给所有在线用户 那么就遍历onlineUsers数组就好了 每个人都发送一次 PmWebSocket webSocket = onlineUsers.get("userid"); //获取推送对象 RemoteEndpoint.Basic basicRemote = webSocket.session.getBasicRemote(); try { //发送消息 basicRemote.sendText(sendmessage); } catch (IOException e) { log.error("广播发送系统消息失败!{}", e); e.printStackTrace(); } } } } /** * 发生错误时调用 */ @OnError public void one rror(Session session, Throwable error) { System.out.println("发生错误"); error.printStackTrace(); } }
第五步:前端连接websocket 这里使用的vue //连接websocket方法 这个放在vue的mounted 或者放在 created里面执行一次就好了
getWebsocket () {
let _this=this
//连接socket this.ws= new WebSocket("ws://localhost:8081/websocket/"+this.loginid) //连接成功后执行的方法
this.ws.onopen=function(){ //ws.send("hello") }
//收到消息执行的方法 this.ws.onmessage = function (evt) { //获取数据
var dataStr = evt.data; var item= JSON.parse(dataStr); _this.message.push(item) //这里就是把获取到的消息 添加到数组遍历出来 }
//这个就是跳转路由的时候关闭连接socket 因为我做的是单页面的聊天室 所以做了这个处理
this.$router.afterEach(function () { ws.close() }) },
发送消息方法
sendMessage(){ this.ws.send(JSON.stringify({
这里就是消息对象,因为后端要获取消息的相关信息 所以要转成json字符串 方便后端操作数据 })) }
大框架都介绍了 细节自己完善
如果觉得可以别忘点赞关注哦