package com.yzx.websocketdemo.server;
import com.alibaba.fastjson2.JSON;
import com.yzx.websocketdemo.pojo.Message;
import org.omg.PortableInterceptor.INACTIVE;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.security.SecureRandom;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.CopyOnWriteArraySet;
@Component
@ServerEndpoint("/chat/{type}")
public class ChetServer {
//存放每个客户端对应的Session对象
//ConcurrentHashMap实现了 Map 接口,基本功能与普通的 HashMap一样。但它具备在多线程环境下高效且安全地进行并发访问和操作的能力。
//private static Map<String, Session> onlineUsersSession = new ConcurrentHashMap<>();
//随机生成userID
private static SecureRandom secureRandom = new SecureRandom();
private Session session; //用户信息
//存放每个客户端对应的MyWebSocket对象
private static CopyOnWriteArraySet<ChetServer> webSocketSet = new CopyOnWriteArraySet();
//接收sid
private String sid = "";
/**
* 连接建立成功调用的方法
* @param session
* @param type 0代表user/1代表service
* @throws IOException
*/
@OnOpen
public void onOpen(Session session,@PathParam("type") Integer type) throws IOException {
String ID = "";
if(type==0){
byte[] buffer = new byte[10];
secureRandom.nextBytes(buffer);// 将随机字节填充到指定的字节数组中
ID = buffer.toString();
}else if(type==1){
ID = "service";
}
//设置当前用户信息
this.sid = ID;
this.session = session;
webSocketSet.add(this);
//向客服端发送在线用户id
Session serviceSession = getSessionById("service");
if(serviceSession!=null){
//获取当前所有在线用户的id
List<String> userIds = getOnlineUsersId();
//String message = JSON.toJSONString(userIds);
String message = userIds.toString();
serviceSession.getBasicRemote().sendText(message);
}
}
/**
* 连接关闭调用的方法
*/
@OnClose
public void onClose(Session session) throws IOException {
webSocketSet.remove(this); //从set中删除
//当前用户下线后,使用客服端的session再给前端发送一下当前在线用户id
Session serviceSession = getSessionById("service");
if(serviceSession!=null){
//获取当前在线用户id
List<String> userIds = getOnlineUsersId();
//String message = JSON.toJSONString(userIds);
String message = userIds.toString();
serviceSession.getBasicRemote().sendText(message);
}
}
/**
* 当浏览器发消息到服务器时,执行该方法
*
* @param message = {"ToId":"***","msg":"***"}
*/
@OnMessage
public void onMessage(String message) throws IOException {
System.out.println(message.toString());
//msg01表示客户端发来的消息,需要服务端转发给目标用户
Message msg01 = JSON.parseObject(message, Message.class);
//要发的消息
String mess = msg01.getMsg();
//发给谁
String toId = msg01.getToId();
//谁发的
String fromId = this.sid;
//获取到目标用户的session
Session toSession = getSessionById(toId);
if(toSession==null){
switch (this.sid){
case "service":
this.session .getBasicRemote().sendText("当前用户已下线~");
System.out.println("当前用户已下线~");
break;
default:
this.session .getBasicRemote().sendText("客服已下线~");
System.out.println(this.sid+"你好,客服已下线~");
break;
}
}else {
Message msg02 = new Message(toId, fromId, mess);
String json_msg02 = JSON.toJSONString(msg02);
toSession.getBasicRemote().sendText(json_msg02);
System.out.println(json_msg02);
}
}
/**
* @ Param session
* @ Param error
*/
@OnError
public void onError(Throwable error) {
System.out.println("发生错误");
error.printStackTrace();
}
//获取所有在线用户Id
public List<String> getOnlineUsersId(){
List<String> userIds = new CopyOnWriteArrayList<String>();
for (ChetServer C:webSocketSet){
if(!C.sid.equals("service"))
userIds.add(C.sid);
}
return userIds;
}
//通过用户id获取session
public Session getSessionById(String userId) {
for (ChetServer C:webSocketSet){
if (C.sid.equals(userId)){
return C.session;
}
}
return null;
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
SpringBoot+WebSocket实现在线客服咨询功能 (139个子文件)
ChetServer.class 5KB
ChetServer.class 5KB
WebSocketServer.class 4KB
WebSocketServer.class 4KB
Message.class 1KB
Message.class 1KB
WebSocketDemoApplication.class 1KB
WebSocketDemoApplication.class 1KB
ToJsonUtil.class 995B
ToJsonUtil.class 995B
WebSocketConfig.class 730B
WebSocketConfig.class 730B
ChatController.class 726B
ChatController.class 726B
layui.css 80KB
layui.css 80KB
layui.css 80KB
layer.css 14KB
layer.css 14KB
layer.css 14KB
laydate.css 8KB
laydate.css 8KB
laydate.css 8KB
code.css 2KB
code.css 2KB
code.css 2KB
iconfont.eot 46KB
iconfont.eot 46KB
iconfont.eot 46KB
loading-0.gif 6KB
loading-0.gif 6KB
loading-0.gif 6KB
loading-2.gif 2KB
loading-2.gif 2KB
loading-2.gif 2KB
loading-1.gif 701B
loading-1.gif 701B
loading-1.gif 701B
.gitignore 395B
.gitignore 184B
service.html 6KB
service.html 6KB
service.html 6KB
user.html 3KB
user.html 3KB
user.html 3KB
index.html 2KB
index.html 2KB
index.html 2KB
fastjson2-2.0.26.jar 1.69MB
spring-boot-autoconfigure-2.7.1.jar 1.6MB
spring-web-5.3.21.jar 1.56MB
jackson-databind-2.13.3.jar 1.47MB
spring-core-5.3.21.jar 1.42MB
spring-boot-2.7.1.jar 1.38MB
xercesImpl-2.11.0.jar 1.3MB
spring-context-5.3.21.jar 1.22MB
spring-webmvc-5.3.21.jar 1005KB
thymeleaf-3.0.15.RELEASE.jar 850KB
spring-beans-5.3.21.jar 682KB
spring-messaging-5.3.21.jar 554KB
logback-core-1.2.11.jar 438KB
spring-websocket-5.3.21.jar 437KB
spring-aop-5.3.21.jar 374KB
jackson-core-2.13.3.jar 366KB
snakeyaml-1.30.jar 324KB
log4j-api-2.17.2.jar 295KB
spring-expression-5.3.21.jar 283KB
attoparser-2.0.5.RELEASE.jar 239KB
logback-classic-1.2.11.jar 226KB
xml-apis-1.4.01.jar 215KB
thymeleaf-spring5-3.0.15.RELEASE.jar 178KB
unbescape-1.1.6.RELEASE.jar 170KB
nekohtml-1.9.22.jar 122KB
jackson-datatype-jsr310-2.13.3.jar 118KB
jackson-annotations-2.13.3.jar 74KB
slf4j-api-1.7.36.jar 40KB
thymeleaf-extras-java8time-3.0.4.RELEASE.jar 39KB
jackson-datatype-jdk8-2.13.3.jar 34KB
jakarta.annotation-api-1.3.5.jar 24KB
spring-jcl-5.3.21.jar 24KB
log4j-to-slf4j-2.17.2.jar 18KB
jackson-module-parameter-names-2.13.3.jar 9KB
spring-boot-starter-web-2.7.1.jar 5KB
spring-boot-starter-websocket-2.7.1.jar 5KB
spring-boot-starter-thymeleaf-2.7.1.jar 5KB
spring-boot-starter-2.7.1.jar 5KB
spring-boot-starter-logging-2.7.1.jar 5KB
spring-boot-starter-json-2.7.1.jar 5KB
jul-to-slf4j-1.7.36.jar 4KB
ChetServer.java 5KB
WebSocketServer.java 4KB
Message.java 1KB
WebSocketDemoApplication.java 840B
WebSocketConfig.java 471B
ToJsonUtil.java 458B
ChatController.java 456B
layui.js 284KB
layui.js 284KB
layui.js 284KB
共 139 条
- 1
- 2
资源评论
Future_yzx
- 粉丝: 365
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- Python 模块和 IPython Notebooks,用于《Python 统计学入门》一书.zip
- Python 概览.zip
- 基于深度学习的火焰场景识别matlab仿真,包括程序,中文注释,仿真操作步骤
- 机械臂RLS控制程序matlab simulink
- bellsoft-jdk8u432+7-windows-amd64.msi
- android 移动应用与开发
- 运动物体识别 opencv python
- 技术资料分享uCOS-II信号量集很好的技术资料.zip
- 技术资料分享ucOS-II入门教程(任哲)很好的技术资料.zip
- 技术资料分享UCOSII 2.90 ReleaseNotes很好的技术资料.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功