package com.example.demo.websocket;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.example.demo.entity.MallAd;
import com.example.demo.model.WebSocketClient;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* websocket连接处理类
*/
@ServerEndpoint(value = "/websocket/{userName}")
@Component
public class WebSocketService {
private static final Logger log = LoggerFactory.getLogger(WebSocketService.class);
//静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。
private static int onlineCount = 0;
//concurrent包的线程安全Set,用来存放每个客户端对应的WebSocketServer对象。
private static ConcurrentHashMap<String, WebSocketClient> webSocketMap = new ConcurrentHashMap<>();
/**
* 与某个客户端的连接会话,需要通过它来给客户端发送数据
*/
private Session session;
/**
* 接收userName
*/
private String userName = "";
/**
* 连接建立成功调用的方法
*/
@OnOpen
public void onOpen(Session session, @PathParam("userName") String userName) {
if (!webSocketMap.containsKey(userName)) {
addOnlineCount(); // 在线数 +1
}
this.session = session;
this.userName = userName;
WebSocketClient client = new WebSocketClient();
client.setSession(session);
client.setUri(session.getRequestURI().toString());
webSocketMap.put(userName, client);
log.info("----------------------------------------------------------------------------");
log.info("用户连接:" + userName + ",当前在线人数为:" + getOnlineCount());
try {
sendMessage("来自后台的反馈:连接成功");
} catch (IOException e) {
log.error("用户:" + userName + ",网络异常!!!!!!");
}
}
/**
* 连接关闭调用的方法
*/
@OnClose
public void onClose() {
if (webSocketMap.containsKey(userName)) {
webSocketMap.remove(userName);
if (webSocketMap.size() > 0) {
//从set中删除
subOnlineCount();
}
}
log.info("----------------------------------------------------------------------------");
log.info(userName + "用户退出,当前在线人数为:" + getOnlineCount());
}
/**
* 收到客户端消息后调用的方法
*
* @param message 客户端发送过来的消息
*/
@OnMessage
public void onMessage(String message, Session session) {
try {
JSONObject jsonObject = JSONObject.parseObject(message);
String type = jsonObject.getString("type");
log.info("收到用户消息:" + userName + ",报文:" + message);
if (type.equals("ping")) {
//心跳
Map<String, Object> params = new HashMap<String, Object>();
params.put("type", "pong");
session.getBasicRemote().sendText(JSON.toJSONString(params));
}
} catch (IOException e) {
e.printStackTrace();
}
//可以群发消息
//消息保存到数据库、redis
if (StringUtils.isNotBlank(message)) {
}
}
/**
* 发生错误
*
* @param session
* @param error
*/
@OnError
public void onError(Session session, Throwable error) {
log.error("用户错误:" + this.userName + ",原因:" + error.getMessage());
error.printStackTrace();
}
/**
* 连接服务器成功后主动推送
*/
public void sendMessage(String message) throws IOException {
synchronized (session) {
this.session.getBasicRemote().sendText(message);
}
}
/**
* 向指定客户端发送消息
*
* @param userName
* @param message
*/
public static void sendMessage(String userName, String message) {
try {
WebSocketClient webSocketClient = webSocketMap.get(userName);
if (webSocketClient != null) {
webSocketClient.getSession().getBasicRemote().sendText(message);
}
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException(e.getMessage());
}
}
/**
* 给所有在线的,发送消息
*/
public static void sendAll(List<MallAd> list) {
String text = JSONObject.toJSONString(list);
webSocketMap.values().forEach(webSocket -> webSocket.getSession().getAsyncRemote().sendText(text));
}
public static synchronized int getOnlineCount() {
return onlineCount;
}
public static synchronized void addOnlineCount() {
WebSocketService.onlineCount++;
}
public static synchronized void subOnlineCount() {
WebSocketService.onlineCount--;
}
public static void setOnlineCount(int onlineCount) {
WebSocketService.onlineCount = onlineCount;
}
public static ConcurrentHashMap<String, WebSocketClient> getWebSocketMap() {
return webSocketMap;
}
public static void setWebSocketMap(ConcurrentHashMap<String, WebSocketClient> webSocketMap) {
WebSocketService.webSocketMap = webSocketMap;
}
public Session getSession() {
return session;
}
public void setSession(Session session) {
this.session = session;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
redis订阅发布实现websocket集群.zip (146个子文件)
WebSocketService.class 8KB
MallAd.class 5KB
RedisRepositoryConfig.class 4KB
PubSubConfig.class 3KB
FastJsonRedisSerializer.class 3KB
Demo.class 2KB
WebSocketClient.class 2KB
MallAdServiceImpl.class 2KB
DemoController.class 1KB
WebsocketApplication.class 748B
WebSocketConfig.class 726B
DemoApplicationTests.class 531B
MallAdService.class 410B
MallAdDao.class 380B
.gitignore 333B
.gitignore 0B
websocket.iml 13KB
WebSocketService.java 6KB
PubSubConfig.java 3KB
RedisRepositoryConfig.java 2KB
FastJsonRedisSerializer.java 2KB
Demo.java 1KB
MallAdServiceImpl.java 1KB
DemoController.java 814B
MallAd.java 556B
WebSocketConfig.java 478B
WebSocketClient.java 469B
WebsocketApplication.java 348B
MallAdDao.java 336B
MallAdService.java 323B
DemoApplicationTests.java 215B
mall_ad.sql 1KB
workspace.xml 25KB
uiDesigner.xml 9KB
pom.xml 3KB
Project_Default.xml 1KB
jarRepositories.xml 1KB
Maven__org_springframework_boot_spring_boot_starter_data_redis_2_2_4_RELEASE.xml 919B
Maven__org_springframework_boot_spring_boot_starter_validation_2_2_4_RELEASE.xml 919B
Maven__org_springframework_boot_spring_boot_test_autoconfigure_2_2_4_RELEASE.xml 919B
Maven__org_springframework_boot_spring_boot_starter_websocket_2_2_4_RELEASE.xml 912B
Maven__org_springframework_boot_spring_boot_starter_logging_2_2_4_RELEASE.xml 898B
Maven__org_springframework_boot_spring_boot_starter_tomcat_2_2_4_RELEASE.xml 891B
Maven__com_fasterxml_jackson_module_jackson_module_parameter_names_2_10_2.xml 886B
Maven__org_springframework_boot_spring_boot_autoconfigure_2_2_4_RELEASE.xml 884B
Maven__org_springframework_boot_spring_boot_starter_test_2_2_4_RELEASE.xml 877B
Maven__org_springframework_boot_spring_boot_starter_jdbc_2_2_4_RELEASE.xml 877B
Maven__org_springframework_boot_spring_boot_starter_json_2_2_4_RELEASE.xml 877B
compiler.xml 872B
Maven__org_springframework_boot_spring_boot_starter_web_2_2_4_RELEASE.xml 870B
Maven__com_vaadin_external_google_android_json_0_0_20131108_vaadin1.xml 850B
Maven__org_springframework_boot_spring_boot_devtools_2_2_4_RELEASE.xml 849B
Maven__org_springframework_data_spring_data_keyvalue_2_2_4_RELEASE.xml 849B
Maven__com_fasterxml_jackson_datatype_jackson_datatype_jsr310_2_10_2.xml 845B
Maven__org_springframework_spring_context_support_5_2_3_RELEASE.xml 843B
Maven__org_springframework_boot_spring_boot_starter_2_2_4_RELEASE.xml 842B
Maven__org_springframework_data_spring_data_commons_2_2_4_RELEASE.xml 842B
Maven__com_fasterxml_jackson_datatype_jackson_datatype_jdk8_2_10_2.xml 831B
Maven__org_hibernate_validator_hibernate_validator_6_0_18_Final.xml 831B
Maven__org_springframework_data_spring_data_redis_2_2_4_RELEASE.xml 828B
Maven__org_springframework_boot_spring_boot_test_2_2_4_RELEASE.xml 821B
Maven__org_apache_tomcat_embed_tomcat_embed_websocket_9_0_30.xml 810B
Maven__org_springframework_spring_expression_5_2_3_RELEASE.xml 808B
Maven__org_springframework_spring_messaging_5_2_3_RELEASE.xml 801B
Maven__com_fasterxml_jackson_core_jackson_annotations_2_10_2.xml 801B
Maven__org_springframework_spring_websocket_5_2_3_RELEASE.xml 801B
Maven__org_springframework_spring_context_5_2_3_RELEASE.xml 787B
Maven__org_springframework_boot_spring_boot_2_2_4_RELEASE.xml 786B
Maven__jakarta_validation_jakarta_validation_api_2_0_2.xml 783B
Maven__jakarta_activation_jakarta_activation_api_1_2_1.xml 783B
Maven__org_junit_platform_junit_platform_commons_1_5_2.xml 783B
Maven__jakarta_annotation_jakarta_annotation_api_1_3_5.xml 783B
Maven__com_baomidou_mybatis_plus_boot_starter_3_4_0.xml 780B
Maven__com_fasterxml_jackson_core_jackson_databind_2_10_2.xml 780B
Maven__org_springframework_spring_webmvc_5_2_3_RELEASE.xml 780B
Maven__org_junit_platform_junit_platform_engine_1_5_2.xml 776B
Maven__org_apache_tomcat_embed_tomcat_embed_core_9_0_30.xml 775B
Maven__org_springframework_spring_beans_5_2_3_RELEASE.xml 773B
Maven__org_springframework_spring_jdbc_5_2_3_RELEASE.xml 766B
Maven__com_baomidou_mybatis_plus_annotation_3_4_0.xml 766B
Maven__org_springframework_spring_core_5_2_3_RELEASE.xml 766B
Maven__org_springframework_spring_test_5_2_3_RELEASE.xml 766B
Maven__org_junit_jupiter_junit_jupiter_params_5_5_2.xml 765B
Maven__org_junit_jupiter_junit_jupiter_engine_5_5_2.xml 765B
Maven__io_projectreactor_reactor_core_3_3_2_RELEASE.xml 765B
Maven__jakarta_xml_bind_jakarta_xml_bind_api_2_3_2.xml 761B
Maven__org_apache_tomcat_embed_tomcat_embed_el_9_0_30.xml 761B
Maven__org_springframework_spring_jcl_5_2_3_RELEASE.xml 759B
Maven__com_baomidou_mybatis_plus_extension_3_4_0.xml 759B
Maven__org_springframework_spring_oxm_5_2_3_RELEASE.xml 759B
Maven__org_springframework_spring_web_5_2_3_RELEASE.xml 759B
Maven__org_springframework_spring_aop_5_2_3_RELEASE.xml 759B
Maven__org_apache_logging_log4j_log4j_to_slf4j_2_12_1.xml 758B
Maven__org_jboss_logging_jboss_logging_3_4_1_Final.xml 758B
Maven__org_springframework_spring_tx_5_2_3_RELEASE.xml 752B
Maven__com_fasterxml_jackson_core_jackson_core_2_10_2.xml 752B
Maven__org_mockito_mockito_junit_jupiter_3_1_0.xml 748B
Maven__org_reactivestreams_reactive_streams_1_0_3.xml 745B
Maven__org_junit_jupiter_junit_jupiter_api_5_5_2.xml 744B
Maven__io_netty_netty_transport_4_1_45_Final.xml 743B
共 146 条
- 1
- 2
余生一个帆
- 粉丝: 2011
- 资源: 32
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
前往页