package com.test.wbsocket.socket;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Maps;
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.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArraySet;
/**
* @author 2018年5月18日16:11:48
*/
@Component
@ServerEndpoint("/websocket/{username}")
public class WebSocket {
private Logger logger = LoggerFactory.getLogger(this.getClass());
/**
* 在线人数
*/
public static int onlineNumber = 0;
/**
* 以用户的姓名为key,WebSocket为对象保存起来
*/
private static Map<String, WebSocket> clients = new ConcurrentHashMap<String, WebSocket>();
/**
* 会话
*/
private Session session;
/**
* 用户名称
*/
private String username;
/**
* 建立连接
*
* @param session
*/
@OnOpen
public void onOpen(@PathParam("username") String username, Session session)
{
onlineNumber++;
logger.info("现在来连接的客户id:"+session.getId()+"用户名:"+username);
this.username = username;
this.session = session;
logger.info("有新连接加入! 当前在线人数" + onlineNumber);
try {
//messageType 1代表上线 2代表下线 3代表在线名单 4代表普通消息
//先给所有人发送通知,说我上线了
Map<String,Object> map1 = Maps.newHashMap();
map1.put("messageType",1);
map1.put("username",username);
sendMessageAll(JSON.toJSONString(map1),username);
//把自己的信息加入到map当中去
clients.put(username, this);
//给自己发一条消息:告诉自己现在都有谁在线
Map<String,Object> map2 = Maps.newHashMap();
map2.put("messageType",3);
//移除掉自己
Set<String> set = clients.keySet();
map2.put("onlineUsers",set);
sendMessageTo(JSON.toJSONString(map2),username);
}
catch (IOException e){
logger.info(username+"上线的时候通知所有人发生了错误");
}
}
@OnError
public void onError(Session session, Throwable error) {
logger.info("服务端发生了错误"+error.getMessage());
//error.printStackTrace();
}
/**
* 连接关闭
*/
@OnClose
public void onClose()
{
onlineNumber--;
//webSockets.remove(this);
clients.remove(username);
try {
//messageType 1代表上线 2代表下线 3代表在线名单 4代表普通消息
Map<String,Object> map1 = Maps.newHashMap();
map1.put("messageType",2);
map1.put("onlineUsers",clients.keySet());
map1.put("username",username);
sendMessageAll(JSON.toJSONString(map1),username);
}
catch (IOException e){
logger.info(username+"下线的时候通知所有人发生了错误");
}
logger.info("有连接关闭! 当前在线人数" + onlineNumber);
}
/**
* 收到客户端的消息
*
* @param message 消息
* @param session 会话
*/
@OnMessage
public void onMessage(String message, Session session)
{
try {
logger.info("来自客户端消息:" + message+"客户端的id是:"+session.getId());
System.out.println("------------ :"+message);
JSONObject jsonObject = JSON.parseObject(message);
String textMessage = jsonObject.getString("message");
String fromusername = jsonObject.getString("username");
String tousername = jsonObject.getString("to");
//如果不是发给所有,那么就发给某一个人
//messageType 1代表上线 2代表下线 3代表在线名单 4代表普通消息
Map<String,Object> map1 = Maps.newHashMap();
map1.put("messageType",4);
map1.put("textMessage",textMessage);
map1.put("fromusername",fromusername);
if(tousername.equals("All")){
map1.put("tousername","所有人");
sendMessageAll(JSON.toJSONString(map1),fromusername);
}
else{
map1.put("tousername",tousername);
sendMessageTo(JSON.toJSONString(map1),tousername);
}
}
catch (Exception e){
e.printStackTrace();
logger.info("发生了错误了");
}
}
public void sendMessageTo(String message, String ToUserName) throws IOException {
for (WebSocket item : clients.values()) {
// System.out.println("在线人员名单 :"+item.username.toString());
if (item.username.equals(ToUserName) ) {
item.session.getAsyncRemote().sendText(message);
break;
}
}
}
public void sendMessageAll(String message,String FromUserName) throws IOException {
for (WebSocket item : clients.values()) {
item.session.getAsyncRemote().sendText(message);
}
}
public static synchronized int getOnlineCount() {
return onlineNumber;
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
Springboot+websocket 实现多人聊天室/单人聊天
共102个文件
xml:73个
java:7个
html:6个
3星 · 超过75%的资源 需积分: 42 140 下载量 29 浏览量
2019-10-11
15:33:21
上传
评论 9
收藏 103KB RAR 举报
温馨提示
这是一个简单使用websocket实现多人聊天室,单人聊天室的demo,里面使用的是最原始的websocket的方法,附有客户端界面可以直接跑起来发送消息看效果。 该项目对应刚刚接触websocket技术是比较有用的。 2019-10-11的个人实测编码运行调试过的demo资源。
资源推荐
资源详情
资源评论
收起资源包目录
Springboot+websocket 实现多人聊天室/单人聊天 (102个子文件)
WebSocketS.class 6KB
WebSocket.class 6KB
WebSocketController.class 2KB
WbsocketApplication.class 747B
WebSocketStompConfig.class 737B
WbsocketApplicationTests.class 636B
mvnw.cmd 6KB
.gitignore 333B
websocket.html 5KB
websocket.html 5KB
websocketS.html 5KB
websocketS.html 5KB
testPage.html 633B
testPage.html 633B
wbsocket.iml 9KB
maven-wrapper.jar 47KB
WebSocket.java 6KB
WebSocketS.java 5KB
MavenWrapperDownloader.java 5KB
WebSocketController.java 2KB
WebSocketStompConfig.java 506B
WbsocketApplicationTests.java 345B
WbsocketApplication.java 329B
wbsocket.kotlin_module 16B
HELP.md 780B
mvnw 9KB
maven-wrapper.properties 116B
application.properties 17B
application.properties 17B
workspace.xml 26KB
uiDesigner.xml 9KB
pom.xml 2KB
compiler.xml 815B
Maven__org_springframework_boot_spring_boot_test_autoconfigure_2_1_9_RELEASE.xml 769B
Maven__org_springframework_boot_spring_boot_starter_thymeleaf_2_1_9_RELEASE.xml 762B
Maven__org_springframework_boot_spring_boot_starter_websocket_2_1_9_RELEASE.xml 762B
Maven__org_springframework_boot_spring_boot_starter_logging_2_1_9_RELEASE.xml 748B
Maven__org_springframework_boot_spring_boot_starter_tomcat_2_1_9_RELEASE.xml 741B
Maven__org_springframework_boot_spring_boot_autoconfigure_2_1_9_RELEASE.xml 734B
Maven__com_fasterxml_jackson_module_jackson_module_parameter_names_2_9_9.xml 729B
Maven__org_springframework_boot_spring_boot_starter_test_2_1_9_RELEASE.xml 727B
Maven__org_springframework_boot_spring_boot_starter_json_2_1_9_RELEASE.xml 727B
Maven__org_thymeleaf_extras_thymeleaf_extras_java8time_3_0_4_RELEASE.xml 725B
Maven__org_springframework_boot_spring_boot_starter_web_2_1_9_RELEASE.xml 720B
Maven__com_vaadin_external_google_android_json_0_0_20131108_vaadin1.xml 700B
Maven__org_springframework_boot_spring_boot_starter_2_1_9_RELEASE.xml 692B
Maven__com_fasterxml_jackson_datatype_jackson_datatype_jsr310_2_9_9.xml 688B
Maven__org_hibernate_validator_hibernate_validator_6_0_17_Final.xml 681B
Maven__com_fasterxml_jackson_datatype_jackson_datatype_jdk8_2_9_9.xml 674B
Maven__org_springframework_boot_spring_boot_test_2_1_9_RELEASE.xml 671B
Maven__org_springframework_spring_expression_5_1_10_RELEASE.xml 665B
Maven__org_apache_tomcat_embed_tomcat_embed_websocket_9_0_26.xml 660B
Maven__org_springframework_spring_messaging_5_1_10_RELEASE.xml 658B
Maven__org_springframework_spring_websocket_5_1_10_RELEASE.xml 658B
Maven__com_fasterxml_jackson_core_jackson_annotations_2_9_0.xml 644B
Maven__org_springframework_spring_context_5_1_10_RELEASE.xml 644B
Maven__org_thymeleaf_thymeleaf_spring5_3_0_11_RELEASE.xml 641B
Maven__org_springframework_spring_webmvc_5_1_10_RELEASE.xml 637B
Maven__com_fasterxml_jackson_core_jackson_databind_2_9_9_3.xml 637B
Maven__org_springframework_boot_spring_boot_2_1_9_RELEASE.xml 636B
Maven__org_springframework_spring_beans_5_1_10_RELEASE.xml 630B
Maven__org_apache_tomcat_embed_tomcat_embed_core_9_0_26.xml 625B
Maven__org_springframework_spring_test_5_1_10_RELEASE.xml 623B
Maven__org_springframework_spring_core_5_1_10_RELEASE.xml 623B
Maven__org_springframework_spring_aop_5_1_10_RELEASE.xml 616B
Maven__org_springframework_spring_jcl_5_1_10_RELEASE.xml 616B
Maven__org_springframework_spring_web_5_1_10_RELEASE.xml 616B
Maven__javax_annotation_javax_annotation_api_1_3_2.xml 611B
Maven__org_apache_tomcat_embed_tomcat_embed_el_9_0_26.xml 611B
Maven__javax_validation_validation_api_2_0_1_Final.xml 611B
Maven__org_apache_logging_log4j_log4j_to_slf4j_2_11_2.xml 608B
Maven__org_jboss_logging_jboss_logging_3_3_3_Final.xml 608B
Maven__com_fasterxml_jackson_core_jackson_core_2_9_9.xml 595B
Maven__org_attoparser_attoparser_2_0_5_RELEASE.xml 589B
Maven__org_thymeleaf_thymeleaf_3_0_11_RELEASE.xml 585B
Maven__org_unbescape_unbescape_1_1_6_RELEASE.xml 578B
Maven__net_bytebuddy_byte_buddy_agent_1_9_16.xml 578B
Maven__org_apache_logging_log4j_log4j_api_2_11_2.xml 573B
Maven__ch_qos_logback_logback_classic_1_2_3.xml 568B
Maven__org_hamcrest_hamcrest_library_1_3.xml 553B
Maven__ch_qos_logback_logback_core_1_2_3.xml 547B
Maven__com_jayway_jsonpath_json_path_2_4_0.xml 546B
Maven__org_assertj_assertj_core_3_11_1.xml 542B
Maven__org_mockito_mockito_core_2_23_4.xml 542B
Maven__net_minidev_accessors_smart_1_2.xml 542B
Maven__org_skyscreamer_jsonassert_1_5_0.xml 537B
Maven__net_bytebuddy_byte_buddy_1_9_16.xml 536B
Maven__org_xmlunit_xmlunit_core_2_6_3.xml 535B
Maven__org_slf4j_jul_to_slf4j_1_7_28.xml 534B
Maven__org_hamcrest_hamcrest_core_1_3.xml 532B
Maven__com_fasterxml_classmate_1_4_0.xml 522B
Maven__org_slf4j_slf4j_api_1_7_28.xml 513B
Maven__org_objenesis_objenesis_2_6.xml 508B
Maven__com_alibaba_fastjson_1_2_7.xml 507B
Maven__net_minidev_json_smart_2_3.xml 507B
Maven__org_yaml_snakeyaml_1_23.xml 495B
Maven__com_google_guava_guava_r05.xml 492B
Maven__org_ow2_asm_asm_5_0_4.xml 472B
Maven__junit_junit_4_12.xml 455B
misc.xml 451B
共 102 条
- 1
- 2
资源评论
- 暮夜殇一风竹2020-10-27已下载,使用测试过
小目标青年
- 粉丝: 23w+
- 资源: 24
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功