WebSocket实现聊天室业务

网友投稿 322 2022-11-28


WebSocket实现聊天室业务

WebSocket实现聊天室业务的具体代码,供大家参考,具体内容如下

页面效果图

pom.xml

主要是spring-boot-starter-websocket包,websocket连接、发送信息。

org.springframework.boot

spring-boot-starter-web

org.springframework.boot

spring-boot-starter-websocket

org.springframework.boot

spring-boot-starter-thymeleaf

org.webjars

webjars-locator-core

org.webjars.npm

mdui

0.4.0

org.webjars

jquery

3.3.1

org.springframework.boot

spring-boot-devtools

runtime

com.alibaba

fastjson

1.2.49

org.springframework.boot

spring-boot-starter-test

test

前台

html + js

websocket 前台主要包括四种方法:

打开连接:onopen

服务端发来消息:1.广播消息 2.更新在线人数 : onmessage

关闭连接 :onclose

通信失败 :onerror

menu

简单聊天室

class="mdui-icon material-icons">search

class="mdui-icon material-icons">search

class="mdui-icon material-icons">exit_to_app

class="mdui-icon material-icons">exit_to_app

more_vert

欢迎:

textsms

onclick="sendMsgToServer()">发送 (enter)

onclick="clearMsg()">清屏

聊天内容

face

在线人数

0

后台

WebSocketChatApplication - 启动类

@SpringBootApplication

@RestController

public class WebSocketChatApplication {

/**

* 登陆界面

*/

@GetMapping("/")

public ModelAndView login() {

return new ModelAndView("/login");

}

/**

* 聊天界面

*/

@GetMapping("/index")

public ModelAndView index(String username, String password, HttpServletRequest request) throws UnknownHostException {

if (StringUtils.isEmpty(username)) {

username = "匿名用户";

}

ModelAndView mav = new ModelAndView("/chat");

mav.addObject("username", username);

mav.addObject("webSocketUrl", "ws://"+InetAddress.getLocalHost().getHostAddress()+":"+request.getServerPort()+request.getContextPath()+"/chat");

return mav;

}

public static void main(String[] args) {

SpringApplication.run(WebSocketChatApplication.class, args);

}

}

WebSocketConfig - WebSocket配置类

@Configuration

public class WebSocketConfig {

/**

* 用于扫描和注册所有携带ServerEndPoint注解的实例。

*

* PS:若部署到外部容器 则无需提供此类。

*/

@Bean

public ServerEndpointExporter serverEndpointExporter() {

return new ServerEndpointExporter();

}

}

Message - 封装信息类

/**

* WebSocket 聊天消息类

*/

public class Message {

public static final String ENTER = "ENTER";

public static final String SPEAK = "SPEAK";

public static final String QUIT = "QUIT";

private String type;//消息类型

private String username; //发送人

private String msg; //发送消息

private int onlineCount; //在线用户数

public static String jsonStr(String type, String username, String msg, int onlineTotal) {

return JSON.toJSONString(new Message(type, username, msg, onlineTotal));

}

public Message(String type, String username, String msg, int onlineCount) {

this.type = type;

this.username = username;

this.msg = msg;

this.onlineCount = onlineCount;

}

public static String getENTER() {

return ENTER;

}

public static String getSPEAK() {

return SPEAK;

}

public static String getQUIT() {

return QUIT;

}

public String getType() {

return type;

}

public void setType(String type) {

this.type = type;

}

public String getUsername() {

return username;

}

public void setUsername(String username) {

this.username = username;

}

public String getMsg() {

return msg;

}

public void setMsg(String msg) {

this.msg = msg;

}

public int getOnlineCount() {

return onlineCount;

}

public void setOnlineCount(int onlineCount) {

this.onlineCount = onlineCount;

}

}

WebSocketChatServer - 聊天服务端

前台对应的四种传输,后台进行处理操作

/**

* WebSocket 聊天服务端

*

* @see ServerEndpoint WebSocket服务端 需指定端点的访问路径

* @see Session WebSocket会话对象 通过它给客户端发送消息

*/

@Component

@ServerEndpoint("/chat")

public class WebSocketChatServer {

/**

* 全部在线会话 PS: 基于场景考虑 这里使用线程安全的Map存储会话对象。

*/

private static Map onlineSessions = new ConcurrentHashMap<>();

/**

* 当客户端打开连接:1.添加会话对象 2.更新在线人数

*/

@OnOpen

public void onOpen(Session session) {

onlineSessions.put(session.getId(), session);

sendMessageToAll(Message.jsonStr(Message.ENTER, "", "", onlineSessions.size()));

}

/**

* 当客户端发送消息:1.获取它的用户名和消息 2.发送消息给所有人

*

* PS: 这里约定传递的消息为JSON字符串 方便传递更多参数!

*/

@OnMessage

public void onMessage(Session session, String jsonStr) {

Message message = JSON.parseObject(jsonStr, Message.class);

sendMessageToAll(Message.jsonStr(Message.SPEAK, message.getUsername(), message.getMsg(), onlineSessions.size()));

}

/**

* 当关闭连接:1.移除会话对象 2.更新在线人数

*/

@OnClose

public void onClose(Session session) {

onlineSessions.remove(session.getId());

sendMessageToAll(Message.jsonStr(Message.QUIT, "", "", onlineSessions.size()));

}

/**

* 当通信发生异常:打印错误日志

*/

@OnError

public void onError(Session session, Throwable error) {

error.printStackTrace();

}

/**

* 公共方法:发送信息给所有人

*/

private static void sendMessageToAll(String msg) {

onlineSessions.forEach((id, session) -> {

try {

session.getBasicRemote().sendText(msg);

} catch (IOException e) {

e.printStackTrace();

}

});

}

}


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:搭建MyBatis开发环境及基本的CURD介绍
下一篇:SpringBoot @PostConstruct原理用法解析
相关文章

 发表评论

暂时没有评论,来抢沙发吧~