package com.badao.demo.websocket;
import io.netty.handler.codec.http.HttpHeaders;
import io.netty.handler.timeout.IdleStateEvent;
import lombok.extern.slf4j.Slf4j;
import org.yeauty.annotation.*;
import org.yeauty.pojo.Session;
import java.io.IOException;
import java.util.concurrent.Semaphore;
@ServerEndpoint(path = "/websocket/{userName}", port = "${ws.port}", readerIdleTimeSeconds = "${ws.readerIdleTimeSeconds}", writerIdleTimeSeconds = "${ws.writerIdleTimeSeconds}", allIdleTimeSeconds = "${ws.allIdleTimeSeconds}")
@Slf4j
public class WebSocketServer {
/**
* 默认最多允许同时在线人数 200
*/
public static int socketMaxOnlineCount = 200;
private static final Semaphore socketSemaphore = new Semaphore(socketMaxOnlineCount);
@OnOpen
public void onOpen(Session session, HttpHeaders headers, @PathVariable String userName) {
boolean semaphoreFlag = false;
// 尝试获取信号量
semaphoreFlag = SemaphoreUtils.tryAcquire(socketSemaphore);
if (!semaphoreFlag) {
// 未获取到信号量
log.error("\n 当前人数 - {} , 限制人数:{} ", WebSocketUsers.getUsers().size(), socketMaxOnlineCount);
WebSocketUsers.sendMessageToUserByText(session, "当前人数:" + WebSocketUsers.getUsers().size() + " 限制人数:" + socketMaxOnlineCount);
session.close();
} else {
// 添加用户
WebSocketUsers.sendMessageToUserByText(session, "连接成功");
WebSocketUsers.put(userName, session);
log.warn("\n 用户:{} 连接后 , 当前人数 : {}", userName, WebSocketUsers.getUsers().size());
}
}
@OnClose
public void onClose(Session session, @PathVariable String userName) throws IOException {
// 移除用户
WebSocketUsers.remove(userName);
log.warn("\n 用户:{} 关闭后 , 当前人数 : {}", userName, WebSocketUsers.getUsers().size());
// 获取到信号量则需释放
SemaphoreUtils.release(socketSemaphore);
}
@OnError
public void onError(Session session, @PathVariable String userName, Throwable exception) {
if (session.isOpen()) {
// 关闭连接
session.close();
}
log.warn("\n 连接异常 - {}", userName);
log.warn("\n 异常信息 - {}", exception);
// 移出用户
WebSocketUsers.remove(userName);
// 获取到信号量则需释放
SemaphoreUtils.release(socketSemaphore);
}
@OnMessage
public void onMessage(Session session, String message) {
WebSocketUsers.sendMessageToUserByText(session, message);
}
@OnBinary
public void onBinary(Session session, byte[] bytes) {
for (byte b : bytes) {
System.out.println(b);
}
session.sendBinary(bytes);
}
@OnEvent
public void onEvent(@PathVariable String userName, Session session, Object evt) {
if (evt instanceof IdleStateEvent) {
IdleStateEvent idleStateEvent = (IdleStateEvent) evt;
switch (idleStateEvent.state()) {
case READER_IDLE:
log.error("user-{} Read timeout!", userName);
session.close();
break;
case WRITER_IDLE:
log.error("user-{} Write timeout!", userName);
session.close();
break;
case ALL_IDLE:
log.error("user-{} All timeout!", userName);
session.close();
break;
default:
break;
}
}
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
SpringBoot中使用Netty开发WebSocket服务改造多线程群发消息示例代码: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/131681393
资源推荐
资源详情
资源评论
收起资源包目录
SpringBoot中使用Netty开发WebSocket服务改造多线程群发消息示例代码.rar (93个子文件)
nettyWebsocketDemo
HELP.md 934B
pom.xml 3KB
src
test
java
com
badao
demo
main
resources
logback.xml 3KB
application.yml 667B
java
com
badao
demo
DemoApplication.java 315B
websocket
WebsocketController.java 455B
WebSocketUsers.java 3KB
SemaphoreUtils.java 1022B
WebSocketServer.java 4KB
config
MyThreadFactory.java 1KB
.idea
jarRepositories.xml 864B
uiDesigner.xml 9KB
libraries
Maven__org_hamcrest_hamcrest_2_2.xml 521B
Maven__org_springframework_boot_spring_boot_test_autoconfigure_2_6_13.xml 744B
Maven__org_apache_tomcat_embed_tomcat_embed_el_9_0_68.xml 635B
Maven__org_apache_tomcat_embed_tomcat_embed_core_9_0_68.xml 649B
Maven__net_bytebuddy_byte_buddy_1_11_22.xml 567B
Maven__org_junit_platform_junit_platform_commons_1_8_2.xml 657B
Maven__org_springframework_boot_spring_boot_2_6_13.xml 611B
Maven__org_projectlombok_lombok_1_18_24.xml 555B
Maven__jakarta_xml_bind_jakarta_xml_bind_api_2_3_3.xml 635B
Maven__org_springframework_spring_beans_5_3_23.xml 598B
Maven__org_springframework_spring_aop_5_3_23.xml 584B
Maven__io_netty_netty_codec_http_4_1_84_Final.xml 624B
Maven__org_assertj_assertj_core_3_21_0.xml 566B
Maven__org_springframework_boot_spring_boot_starter_json_2_6_13.xml 702B
Maven__ch_qos_logback_logback_core_1_2_11.xml 578B
Maven__io_netty_netty_common_4_1_84_Final.xml 596B
Maven__org_ow2_asm_asm_9_1.xml 482B
Maven__org_junit_jupiter_junit_jupiter_params_5_8_2.xml 639B
Maven__org_junit_platform_junit_platform_engine_1_8_2.xml 650B
Maven__org_springframework_spring_test_5_3_23.xml 591B
Maven__io_netty_netty_resolver_4_1_84_Final.xml 610B
Maven__io_netty_netty_codec_4_1_84_Final.xml 589B
Maven__com_fasterxml_jackson_core_jackson_databind_2_13_4_2.xml 668B
Maven__org_apache_logging_log4j_log4j_to_slf4j_2_17_2.xml 632B
Maven__org_springframework_boot_spring_boot_autoconfigure_2_6_13.xml 709B
Maven__org_mockito_mockito_core_4_0_0.xml 559B
Maven__com_fasterxml_jackson_datatype_jackson_datatype_jsr310_2_13_4.xml 719B
Maven__org_springframework_boot_spring_boot_test_2_6_13.xml 646B
Maven__org_junit_jupiter_junit_jupiter_api_5_8_2.xml 618B
Maven__io_netty_netty_buffer_4_1_84_Final.xml 596B
Maven__com_fasterxml_jackson_core_jackson_annotations_2_13_4.xml 675B
Maven__org_springframework_spring_context_5_3_23.xml 612B
Maven__org_springframework_spring_webmvc_5_3_23.xml 605B
Maven__org_slf4j_slf4j_api_1_7_36.xml 537B
Maven__jakarta_activation_jakarta_activation_api_1_2_2.xml 657B
Maven__com_vaadin_external_google_android_json_0_0_20131108_vaadin1.xml 724B
Maven__com_fasterxml_jackson_module_jackson_module_parameter_names_2_13_4.xml 760B
Maven__org_skyscreamer_jsonassert_1_5_1.xml 561B
Maven__io_netty_netty_handler_4_1_84_Final.xml 603B
Maven__org_opentest4j_opentest4j_1_2_0.xml 557B
Maven__org_springframework_spring_jcl_5_3_23.xml 584B
Maven__org_apiguardian_apiguardian_api_1_1_2.xml 596B
Maven__org_apache_logging_log4j_log4j_api_2_17_2.xml 597B
Maven__jakarta_annotation_jakarta_annotation_api_1_3_5.xml 657B
Maven__org_springframework_boot_spring_boot_starter_test_2_6_13.xml 702B
Maven__org_slf4j_jul_to_slf4j_1_7_36.xml 558B
Maven__com_fasterxml_jackson_core_jackson_core_2_13_4.xml 626B
Maven__org_objenesis_objenesis_3_2.xml 532B
Maven__org_springframework_spring_core_5_3_23.xml 591B
Maven__ch_qos_logback_logback_classic_1_2_11.xml 599B
Maven__org_junit_jupiter_junit_jupiter_5_8_2.xml 590B
Maven__net_minidev_json_smart_2_4_8.xml 545B
Maven__org_springframework_boot_spring_boot_starter_2_6_13.xml 667B
Maven__org_springframework_boot_spring_boot_starter_web_2_6_13.xml 695B
Maven__net_bytebuddy_byte_buddy_agent_1_11_22.xml 609B
Maven__net_minidev_accessors_smart_2_4_8.xml 580B
Maven__org_springframework_boot_spring_boot_starter_tomcat_2_6_13.xml 716B
Maven__org_xmlunit_xmlunit_core_2_8_4.xml 559B
Maven__org_springframework_spring_web_5_3_23.xml 584B
Maven__io_netty_netty_transport_4_1_84_Final.xml 617B
Maven__org_springframework_boot_spring_boot_starter_logging_2_6_13.xml 723B
Maven__org_mockito_mockito_junit_jupiter_4_0_0.xml 622B
Maven__com_jayway_jsonpath_json_path_2_6_0.xml 570B
Maven__org_yeauty_netty_websocket_spring_boot_starter_0_12_0.xml 723B
Maven__org_springframework_spring_expression_5_3_23.xml 633B
Maven__org_apache_tomcat_embed_tomcat_embed_websocket_9_0_68.xml 684B
Maven__com_fasterxml_jackson_datatype_jackson_datatype_jdk8_2_13_4.xml 705B
Maven__org_junit_jupiter_junit_jupiter_engine_5_8_2.xml 639B
Maven__io_netty_netty_transport_native_unix_common_4_1_84_Final.xml 750B
Maven__org_yaml_snakeyaml_1_29.xml 519B
vcs.xml 253B
workspace.xml 6KB
misc.xml 457B
compiler.xml 727B
modules.xml 283B
.gitignore 258B
encodings.xml 267B
logs
sys-error.log 2KB
sys-info.log 3KB
.gitignore 395B
nettyWebsocketDemo.iml 9KB
共 93 条
- 1
资源评论
- tsinghualx2024-04-08内容与描述一致,超赞的资源,值得借鉴的内容很多,支持!
霸道流氓气质
- 粉丝: 1w+
- 资源: 589
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功