package com.chat.controller;
import com.alibaba.fastjson.JSONObject;
import com.chat.bean.ChatMsg;
import com.chat.service.ChatMsgService;
import com.chat.util.EmojiFilter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.concurrent.ConcurrentHashMap;
/**
* @ServerEndpoint 注解是一个类层次的注解,它的功能主要是将目前的类定义成一个websocket服务器端,
* 注解的值将被用于监听用户连接的终端访问URL地址,客户端可以通过这个URL来连接到WebSocket服务器端
* @ServerEndpoint 可以把当前类变成websocket服务类
*/
@Controller
@ServerEndpoint(value = "/websocket/{userno}")
public class ChatWebSocket {
// 这里使用静态,让 service 属于类
private static ChatMsgService chatMsgService;
// 注入的时候,给类的 service 注入
@Autowired
public void setChatService(ChatMsgService chatService) {
ChatWebSocket.chatMsgService = chatService;
}
//静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。
private static int onlineCount = 0;
//concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。若要实现服务端与单一客户端通信的话,可以使用Map来存放,其中Key可以为用户标识
private static ConcurrentHashMap<String, ChatWebSocket> webSocketSet = new ConcurrentHashMap<String, ChatWebSocket>();
//与某个客户端的连接会话,需要通过它来给客户端发送数据
private Session WebSocketsession;
//当前发消息的人员编号
private String userno = "";
/**
* 连接建立成功调用的方法
*
* session 可选的参数。session为与某个客户端的连接会话,需要通过它来给客户端发送数据
*/
@OnOpen
public void onOpen(@PathParam(value = "userno") String param, Session WebSocketsession) {
userno = param;//接收到发送消息的人员编号
this.WebSocketsession = WebSocketsession;
webSocketSet.put(param, this);//加入map中
addOnlineCount(); //在线数加1
//System.out.println("有新连接加入!当前在线人数为" + getOnlineCount());
}
/**
* 连接关闭调用的方法
*/
@OnClose
public void onClose() {
if (!userno.equals("")) {
webSocketSet.remove(userno); //从set中删除
subOnlineCount(); //在线数减1
//System.out.println("有一连接关闭!当前在线人数为" + getOnlineCount());
}
}
/**
* 收到客户端消息后调用的方法
*
* @param chatmsg 客户端发送过来的消息
* @param session 可选的参数
*/
@SuppressWarnings("unused")
@OnMessage
public void onMessage(String chatmsg, Session session) {
JSONObject jsonObject = JSONObject.parseObject(chatmsg);
//给指定的人发消息
sendToUser(jsonObject.toJavaObject(ChatMsg.class));
//sendAll(message);
}
/**
* 给指定的人发送消息
*
* @param chatMsg 消息对象
*/
public void sendToUser(ChatMsg chatMsg) {
String reviceUserid = chatMsg.getReciveuserid();
String sendMessage = chatMsg.getSendtext();
sendMessage= EmojiFilter.filterEmoji(sendMessage);//过滤输入法输入的表情
chatMsgService.InsertChatMsg(new ChatMsg().setMsgtype(chatMsg.getMsgtype()).setReciveuserid(reviceUserid).setSenduserid(userno).setSendtext(sendMessage));
try {
if (webSocketSet.get(reviceUserid) != null) {
webSocketSet.get(reviceUserid).sendMessage(userno+"|"+sendMessage);
}else{
webSocketSet.get(userno).sendMessage("0"+"|"+"当前用户不在线");
}
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 给所有人发消息
*
* @param message
*/
private void sendAll(String message) {
String sendMessage = message.split("[|]")[1];
//遍历HashMap
for (String key : webSocketSet.keySet()) {
try {
//判断接收用户是否是当前发消息的用户
if (!userno.equals(key)) {
webSocketSet.get(key).sendMessage(sendMessage);
System.out.println("key = " + key);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 发生错误时调用
*
* @param session
* @param error
*/
@OnError
public void onError(Session session, Throwable error) {
error.printStackTrace();
}
/**
* 这个方法与上面几个方法不一样。没有用注解,是根据自己需要添加的方法。
*
* @param message
* @throws IOException
*/
public void sendMessage(String message) throws IOException {
this.WebSocketsession.getBasicRemote().sendText(message);
//this.session.getAsyncRemote().sendText(message);
}
public static synchronized int getOnlineCount() {
return onlineCount;
}
public static synchronized void addOnlineCount() {
ChatWebSocket.onlineCount++;
}
public static synchronized void subOnlineCount() {
ChatWebSocket.onlineCount--;
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
基于Springboot+websocket的web聊天项目(论文+程序设计源码+数据库文件)
共431个文件
gif:156个
xml:107个
js:56个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
5星 · 超过95%的资源 13 下载量 123 浏览量
2021-06-14
21:53:11
上传
评论 8
收藏 18.05MB RAR 举报
温馨提示
1 绪论 3 1.1 项目开发背景 3 1.2 项目开发意义 3 1.3 项目主要的内容 4 2 相关技术介绍及系统环境开发条件 4 2.1相关技术介绍 4 2.2系统环境开发条件 5 3 系统的需求分析与设计 6 3.1可行性分析 6 3.2需求分析 7 3.2.1系统总体概述 7 3.2.2功能性需求 7 3.2.3非功能性需求 8 3.3概要设计 8 服务端结构 8 客户端结构 9 3.2.5系统ER图设计 10 3.3 数据库设计 11 3.3.1数据库设计的原则 11 3.3.2数据库ER图设计 11 3.3.3数据库表的设计 11 4系统功能模块实现 12 4.1 登陆功能模块实现 12 4.2 聊天页面功能实现 14 4.2日志功能模块 17 5 系统测试 17 5.1系统调试的目的和意义 17 5.2功能测试用例 18 6总结 19 参考文献: 19 致 谢 20
资源推荐
资源详情
资源评论
收起资源包目录
基于Springboot+websocket的web聊天项目(论文+程序设计源码+数据库文件) (431个子文件)
ChatCtrl.class 6KB
ChatWebSocket.class 5KB
R.class 5KB
ChatMsg.class 3KB
ChatFriends.class 3KB
Userinfo.class 3KB
Login.class 3KB
MyConfig.class 2KB
DruidConfig.class 2KB
GlobalExceptionHandler.class 2KB
ResultCodeEnum.class 2KB
AdminInterceptor.class 2KB
CMSException.class 2KB
LoginCtrl.class 2KB
TeacherAdminController.class 2KB
Md5Util.class 2KB
EmojiFilter.class 2KB
MyConfig$1.class 1KB
ChatFriendsService.class 1KB
ChatMsgService.class 1KB
SpringbootChatApplication.class 920B
LoginService.class 902B
WebSocketConfig.class 777B
TestUtil.class 692B
SpringbootChatApplicationTests.class 533B
ChatFriendsMapper.class 504B
ChatMsgMapper.class 447B
LoginMapper.class 253B
layui.css 73KB
layui.css 73KB
layer.css 14KB
layer.css 14KB
layui.mobile.css 10KB
layui.mobile.css 10KB
laydate.css 7KB
laydate.css 7KB
htmleaf-demo.css 6KB
htmleaf-demo.css 6KB
lgstyle.css 5KB
lgstyle.css 5KB
talk.css 3KB
talk.css 3KB
infostyle.css 1KB
infostyle.css 1KB
code.css 1KB
code.css 1KB
基于Springboot聊天项目设计与实现.docx 481KB
iconfont.eot 46KB
iconfont.eot 46KB
loading1.gif 38KB
loading1.gif 38KB
loading3.gif 15KB
loading3.gif 15KB
loading2.gif 11KB
loading2.gif 11KB
59.gif 10KB
59.gif 10KB
22.gif 10KB
22.gif 10KB
24.gif 8KB
24.gif 8KB
13.gif 7KB
13.gif 7KB
16.gif 7KB
16.gif 7KB
39.gif 6KB
39.gif 6KB
64.gif 6KB
64.gif 6KB
63.gif 6KB
63.gif 6KB
50.gif 6KB
50.gif 6KB
loading-0.gif 6KB
loading-0.gif 6KB
4.gif 6KB
4.gif 6KB
1.gif 5KB
1.gif 5KB
42.gif 5KB
42.gif 5KB
71.gif 5KB
71.gif 5KB
21.gif 5KB
21.gif 5KB
20.gif 5KB
20.gif 5KB
29.gif 5KB
29.gif 5KB
70.gif 4KB
70.gif 4KB
5.gif 4KB
5.gif 4KB
17.gif 4KB
17.gif 4KB
27.gif 4KB
27.gif 4KB
9.gif 4KB
9.gif 4KB
44.gif 4KB
共 431 条
- 1
- 2
- 3
- 4
- 5
程序员小蛋
- 粉丝: 2419
- 资源: 481
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
- 3
前往页