Springboot系列之十三:集成WebSocket实现在线聊天

阅读:https://blog.csdn.net/memmsc/article/details/80838012
https://www.runoob.com/html/html5-websocket.html
转自:https://blog.csdn.net/u012702547/article/details/79523133

本文是vhr系列的第十四篇,项目地址:https://github.com/lenve/vhr

在线聊天功能是为了方便HR快速交流,由于HR人数有限,因此这里并未考虑高并发问题,小伙伴思考问题一定要结合上下文环境。OK,我们先来看看效果图:

在线聊天效果图

登陆成功后,点击右上角的闹铃图标,进入到消息页面,点击 好友聊天 选项卡,效果如下:

p306

此时换个浏览器,或者使用chrome中的多用户模式再打开一个浏览器,以另外一个用户身份登录,开始进行聊天,聊天页面如下:

p307

如果系统管理员正在和韩愈聊天,此时李白发来的消息,则李白的姓名旁会有提示:

p308

系统消息效果图

只有管理员具备发送系统消息的权限,管理员的系统消息页面如下:

p309

普通HR的系统消息页面没有发送按钮,发送系统消息页面如下:

p310

消息发送成功之后,会有红点提示未读消息,如下:

p311

OK,大致效果就是这样,功能还不是很完善,后期有时间再进行修补。

下篇文章开始我们来介绍具体的实现思路,着急的小伙伴可以先star项目自己研究(^_^)





SpringBoot+WebSocket实现在线聊天(二)


在线聊天使用了SpringBoot+WebSocket实现,为了保证用户隐私,所有的聊天数据都保存在系统本地,服务器只进行了数据转发。OK,那接下来,我们来看下大致的实现步骤。

服务端

服务端首先加入websocket依赖,如下:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
 
 
  • 1
  • 2
  • 3
  • 4

创建WebSocket的配置类,如下:

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
    @Override
    public void registerStompEndpoints(StompEndpointRegistry stompEndpointRegistry) {
        stompEndpointRegistry.addEndpoint("/ws/endpointChat").withSockJS();
    }

    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        registry.enableSimpleBroker("/queue","/topic");
    }
}
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

这里我并未使用原生的websocket协议,而是使用了websocket的子协议stomp,方便一些。消息代理既使用了/queue,又使用了/topic,主要是因为我这里既有点对点的单聊(queue),也有发送系统消息的群聊(topic)。

创建websocket处理类Controller,如下:

@Controller
public class WsController {
    @Autowired
    SimpMessagingTemplate messagingTemplate;

    @MessageMapping("/ws/chat")
    public void handleChat(Principal principal, String msg) {
        String destUser = msg.substring(msg.lastIndexOf(";") + 1, msg.length());
        String message = msg.substring(0, msg.lastIndexOf(";"));
        messagingTemplate.convertAndSendToUser(destUser, "/queue/chat", new ChatResp(message, principal.getName()));
    }
}
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

消息协议很简单:发送来的消息,最后一个;后面跟的是该条消息要发送到哪个用户,这里通过字符串截取将之提取出来。响应消息包含两个字段,一个是消息内容,一个是该条消息由谁发送。

OK,如此之后,我们的服务端就写好了,很简单。

前端

前端代码稍微复杂,我这里主要和小伙伴介绍下我的大致思路和核心代码,具体代码小伙伴可以star源码进行研究。

首先,当用户登录成功之后,我就发起websocket的连接,将ws连接起来,ws的代码我主要写在了store中,如下:

connect(context){
    context.state.stomp = Stomp.over(new SockJS("/ws/endpointChat"));
    context.state.stomp.connect({}, frame=> {
    context.state.stomp.subscribe("/user/queue/chat", message=> {
        var msg = JSON.parse(message.body);
        var oldMsg = window.localStorage.getItem(context.state.user.username + "#" + msg.from);
        if (oldMsg == null) {
        oldMsg = [];
        oldMsg.push(msg);
        window.localStorage.setItem(context.state.user.username + "#" + msg.from, JSON.stringify(oldMsg))
        } else {
        var oldMsgJson = JSON.parse(oldMsg);
        oldMsgJson.push(msg);
        window.localStorage.setItem(context.state.user.username + "#" + msg.from, JSON.stringify(oldMsgJson))
        }
        if (msg.from != context.state.currentFriend.username) {
        context.commit("addValue2DotMap", "isDot#" + context.state.user.username + "#" + msg.from);
        }
        //更新msgList
        var oldMsg2 = window.localStorage.getItem(context.state.user.username + "#" + context.state.currentFriend.username);
        if (oldMsg2 == null) {
        context.commit('updateMsgList', []);
        } else {
        context.commit('updateMsgList', JSON.parse(oldMsg2));
        }
    });
    }, failedMsg=> {

    });
}
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

连接成功之后,就可以准备接收服务端的消息了,接收到服务端的消息后,数据保存在localStorage中,保存格式是 当前用户名#消息发送方用户名:[{from:'消息发送方',msg:'消息内容'}],注意后面的是一个json数组,整个存储的key之所以用当前用户名#消息发送方用户名是为了避免同一个浏览器多个用户登录所产生的数据紊乱,OK,这样两个人的聊天记录都将保存在这个数组中。在聊天展示页面,当数组中的数据发生变化时,自动更新。

在聊天页面,通过stomp发送消息,如下:

this.$store.state.stomp.send("/ws/chat", {}, this.msg + ";" + this.currentFriend.username);
 
 
  • 1

注意每条消息的内容除了内容本身外,还要加上当前发送者的名字。
每次发送成功后更新聊天页面即可。更新聊天页面代码如下:

<template v-for="msg in msgList">
<!--发送来的消息-->
<div
    style="display: flex;justify-content: flex-start;align-items: center;box-sizing: border-box;"
    v-if="msg.from==currentFriend.username">
    <img :src="currentFriend.userface" class="userfaceImg">
    <div
    style="display: inline-flex;border-style: solid;border-width: 1px;border-color: #20a0ff;border-radius: 5px;padding: 5px 8px 5px 8px">
    {{msg.msg}}
    </div>
</div>
<!--发出去的消息-->
<div v-if="msg.from!=currentFriend.username"
        style="display: flex;justify-content: flex-end;align-items: center;box-sizing: border-box;">
    <div
    style="display: inline-flex;border-style: solid;border-width: 1px;border-color: #20a0ff;border-radius: 5px;padding: 5px 8px 5px 8px;margin-right: 3px;background-color: #9eea6a">
    {{msg.msg}}
    </div>
    <img :src="currentUser.userface" class="userfaceImg">
</div>
</template>
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

如果消息中的from字段的值,就是当前聊天的用户名,则是发送来的消息,否则就是发出去的消息,不同的消息设置不同的样式即可。

核心代码基本如此,但是琐碎的细节其实是比较多的,小伙伴可以star源码进行研究。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Spring Boot中实现WebSocket移动端即时聊天功能,你可以按照以下步骤进行操作: 1. 首先,创建一个Spring Boot项目并引入Spring WebSocket依赖。 2. 在项目中创建一个WebSocket配置类,该类需要继承自`AbstractWebSocketMessageBrokerConfigurer`。在配置类中,你可以指定WebSocket的端点和处理器。 3. 创建一个WebSocket处理器类,该类需要实现`WebSocketHandler`接口,并重写相应的方法来处理连接、消息和断开连接等事件。 4. 在处理器类中,你可以定义一些方法来处理不同的消息类型,比如文本消息或二进制消息。 5. 在移动端应用中,你需要使用WebSocket客户端库来实现WebSocket连接和消息发送。你可以使用一些流行的移动端库,比如Socket.IO、OkHttp等。 6. 在移动端应用中,你需要创建一个WebSocket客户端实例,并指定服务器的地址和端口来建立连接。 7. 一旦连接建立成功,你就可以发送消息给服务器或接收服务器发送的消息。你可以根据需求来实现即时聊天的功能,比如发送文本消息、图片、语音等。 8. 在服务器端,你可以使用消息代理来处理消息的路由和分发。Spring Boot提供了一个内置的消息代理`SimpleBrokerMessage`,你可以使用它来实现消息的广播和点对点传递。 9. 最后,你需要在移动端应用中实现消息的显示和交互。你可以使用RecyclerView或ListView来展示消息列表,并提供发送消息的输入框和按钮等。 通过以上步骤,你可以在Spring Boot中集成WebSocket,并实现移动端的即时聊天功能。请根据实际情况进行具体的实现和调整。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [SpringBootWebSocket添加安全认证与授权功能](https://blog.csdn.net/universsky2015/article/details/131990307)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值