web -【在线聊天】

1.WebSocket:

       1.1 什么是WebSocket:

         WebSocket是HTML5开始提供的一种在单个TCP连接上进行双工通讯的协议。

        WebSocket 使得客户端与服务器之间得数据交换变得简单,允许服务器端主动向客户端推送数据。在WebSocket API中,浏览器与服务器只需要一次握手,再者之间就直接创建持久性得连接,并进行双向数据运输。

        它最大得特点就是,服务器可以主动向客户端推送信息。客户端也可以主动向服务器发送信息,是真正得双向平等对话,属于服务器推送技术得一种。

Http与WebSocket的区别:

        最主要的是:webSocket服务器端可以主动给客户端推送消息

 其他特点包括:较少得控制开销,更强的实时性,保持连接状态,更好的二进制支持,可以支持扩展,更好的压缩效果。

       1.2 为什么需要WebSocket

        举例来说,我们想了解今天的天气,只能是客户端向服务器发出请求,服务器返回查询结果。HTTP 协议做不到服务器主动向客户端推送信息。
        现在,很多网站为了实现推送技术,所用的技术都是Ajax轮询。轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发出HTTP请求,然后由服务器返回最新的数据给客户端的浏览器。这种传统的模式带来很明显的缺点,即浏览器需要不断的向服务器发出请求,然而HTTP请求可能包含较长的头部,其中真正有效的数据可能只是很小的一部分,显然这样会浪费很多的带宽等资源。
        而比较新的技术去做轮询的效果是Comet。这种技术虽然可以双向通信,但依然需要反复发出请求。而且在 Comet中,普遍采用的长链接,也会消耗服务器资源。
        HTML5 定义的WebSocket 协议,能更好的节省服务器资源和带宽,并且能够更实时地进行通讯。

2.WebSocket实现聊天功能:

pom文件所需依赖:

<!--websocket 依赖-->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId>
</dependency>

WebSocket 配置类:

package com.nice.server.config;import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.nice.server.config.security.component.JwtTokenUtil;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.Message;
import org.springframework.messaging.MessageChannel;
import org.springframework.messaging.simp.config.ChannelRegistration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.messaging.simp.stomp.StompCommand;
import org.springframework.messaging.simp.stomp.StompHeaderAccessor;
import org.springframework.messaging.support.ChannelInterceptor;
import org.springframework.messaging.support.MessageHeaderAccessor;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;import javax.annotation.Resource;/*** webSocket配置类*/
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {@Value("${jwt.tokenHead}")//private String tokenHead;@Resourceprivate JwtTokenUtil jwtTokenUtil;@Resourceprivate UserDetailsService userDetailsService;/*** 添加这个Endpoint,这样在网页可以通过websocket连接上服务* 也就是我们配置websocket的服务地址,并且可以指定是否使用socketJS* @param registry*/@Override   //这是是让前端连接我们public void registerStompEndpoints(StompEndpointRegistry registry) {/*** 1.将ws/ep路径注册为stomp的端点,用户连接了这个端点就可以进行websocket通讯,支持socketJS* 2.setAllowedOrigins("*"): 允许跨域* 3.withSockJS():支持socketJS访问*/registry.addEndpoint("/ws/ep").setAllowedOrigins("*").withSockJS();}/*** 输入通道参数配置* @param registration*/@Overridepublic void configureClientInboundChannel(ChannelRegistration registration) {registration.interceptors(new ChannelInterceptor() {@Overridepublic Message<?> preSend(Message<?> message, MessageChannel channel) {StompHeaderAccessor accessor = MessageHeaderAccessor.getAccessor(message, StompHeaderAccessor.class);//判断是否为连接,如果是,需要获取token,并且设置用户对象if (StompCommand.CONNECT.equals(accessor.getCommand())){String token = accessor.getFirstNativeHeader("Auth-Token"); //Auth-Token 为前端传给我们的if (!StringUtils.isEmpty(token)){String authToken = token.substring(tokenHead.length());String username = jwtTokenUtil.getUserNameFromToken(authToken);//token中存在用户名if (!StringUtils.isEmpty(username)){//登录UserDetails userDetails = userDetailsService.loadUserByUsername(username);//验证token是否有效,重新设置用户对象if (jwtTokenUtil.validateToken(authToken,userDetails)){UsernamePasswordAuthenticationToken authenticationToken =new UsernamePasswordAuthenticationToken(userDetails, null,userDetails.getAuthorities());SecurityContextHolder.getContext().setAuthentication(authenticationToken);accessor.setUser(authenticationToken);//}}}}return message;}});}/*** 配置消息代理* @param registry*/@Override   //这个是主动推送消息,/queue 让前端有地方接收public void configureMessageBroker(MessageBrokerRegistry registry) {//配置代理域,可以配置多个,配置代理目的地前缀为/queue,可以在配置域上向客户端推送消息registry.enableSimpleBroker("/queue");}
}

定义一个消息类:

package com.nice.server.pojo;import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;import java.time.LocalDateTime;/*** 消息*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class ChatMsg {private String from;private String to;private String content;private LocalDateTime date;private String formNickName;}

webSocketController:

package com.nice.server.controller;import com.nice.server.pojo.Admin;
import com.nice.server.pojo.ChatMsg;
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.simp.SimpMessagingTemplate;
import org.springframework.security.core.Authentication;
import org.springframework.stereotype.Controller;import javax.annotation.Resource;
import java.time.LocalDateTime;/*** websocket*/
@Controller//
public class WsController {@Resourceprivate SimpMessagingTemplate simpMessagingTemplate;@MessageMapping("/ws/chat")public void handleMsg(Authentication authentication, ChatMsg chatMsg){Admin admin = (Admin) authentication.getPrincipal();chatMsg.setFrom(admin.getUsername());chatMsg.setFormNickName(admin.getName());chatMsg.setDate(LocalDateTime.now());simpMessagingTemplate.convertAndSendToUser(chatMsg.getTo(),"/queue/chat",chatMsg);}}

在线聊天:

 设置端口,允许跨域

package com.nice.server.controller;import com.nice.server.pojo.Admin;
import com.nice.server.service.IAdminService;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource;
import java.util.List;/*** 在线聊天*/
@RestController
@RequestMapping("/chat")
public class ChatController {@Resourceprivate IAdminService adminService;@ApiOperation(value = "获取所有操作员")@GetMapping("/admin")public List<Admin> getAllAdmins(String keywords){return adminService.getAllAdmins(keywords);}}

效果:

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/24934.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

合理利用chatGpt之新冠阳性

&#x1f3c6;今日学习目标&#xff1a; &#x1f340;合理利用chatGpt之新冠阳性 ✅创作者&#xff1a;林在闪闪发光 ⏰预计时间&#xff1a;30分钟 &#x1f389;个人主页&#xff1a;林在闪闪发光的个人主页 &#x1f341;林在闪闪发光的个人社区&#xff0c;欢迎你的加入:…

基于PyQt5实现同一窗口下多界面切换

基于Python和PyQt5实现同一窗口下多界面切换 基于pyqt5控件tabWidget结合按钮点击实现同窗口下固定区域不同界面切换。每个子界面均可拓展相应的功能。 效果 pyqt5同窗口多界面切换

统计平均分:从文本读取成绩并计算平均分,将平均分写入文本文件保存

从文本读取成绩并计算平均分&#xff0c;将平均分写入文本文件保存。 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free&#xff1a;大咖免费“圣经”教程《 python 完全自学教程》&#xff0c;不仅仅是基础那么简单…… 地址&#xff1a;htt…

x in ‘Yy‘ == x in list(‘Yy‘)? ‘‘ 空字符串是任何字符串的子串

‘’ 空字符串是任何字符串的子串。如果您也喜欢 in 的简洁美妙&#xff0c; in 字符串时切记谨慎操作。 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free&#xff1a;大咖免费“圣经”教程《 python 完全自学教程》&#xff0c;不仅仅是基础…

Python 代码打造小 AI ,罗列博文笔记总索引列表,自动生成“我的博文笔记总索引”博文 HTML5 源码文本

Python 代码打造小 AI &#xff0c;获取笔记信息&#xff0c;自动阅读量降序编排索引列表&#xff0c;生成 HTML5 源码文本。 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free&#xff1a;大咖免费“圣经”教程《 python 完全自学教程》&…

Python四则运算“计算器”——整数口算练习“小程序”

设定练习题目数量、最大取值整数数&#xff0c;即时判定&#xff0c;答对鼓励答错打印正确结果。 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free&#xff1a;大咖免费“圣经”教程《 python 完全自学教程》&#xff0c;不仅仅是基础那么简…

排位赛结果“测谎”

甲乙丙丁说的关于排位赛结果只正确一半&#xff0c;根据甲乙丙丁说的信息求出正确的排位赛结果顺序。 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free&#xff1a;大咖免费“圣经”教程《 python 完全自学教程》&#xff0c;不仅仅是基础那…

阶乘求和——求1~202320232023的阶乘总和的末尾九位数字

求 1! 2! 3! … 202320232023! &#xff0c;总和的末尾九位数字。 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free&#xff1a;大咖免费“圣经”教程《 python 完全自学教程》&#xff0c;不仅仅是基础那么简单…… 地址&#xff1a;ht…

五分钟写一段Python代码调用ChatGPT服务

ChatGPT是现在很火的AI网站&#xff0c;行业里现在也有很多围绕ChatGPT进行二次开发的AI产品。今天我们来试一试&#xff0c;花5分钟时间&#xff0c;自己写一段代码来调用ChatGPT的服务。希望通过这个小任务&#xff0c;大家会发现ChatGPT和AI离我们并不遥远。 前提&#xff…

教育硬件“老玩家”进入智能手机新赛道,小度胜算几何?

从5月8日有传言称“百度旗下小度将进军智能手机市场”&#xff0c;到5月17日小度官宣将推出旗下新物种产品——小度青禾学习手机&#xff0c;小度在短短10天时间成为市场关注的焦点。 而5月22日&#xff0c;其也拿出了真正的成果&#xff0c;这部专门为青少年打造的学习手机正…

小度即将推出智能手机产品,醉翁之意意在何为?

5月8日&#xff0c;智哪儿从相关渠道获悉&#xff0c;小度即将于5月下旬发布首款智能手机产品。小度科技通过公开渠道确认了上述信息并透露将于下周披露更详细的产品信息。根据市场调查机构Counterpoint Research公布的最新报告&#xff0c;2023年第一季度全球智能手机市场出货…

当 AI 冲击自动化编程,谁将成为受益者?

整理 | 明明如月 责编 | 何苗 出品 | 《开谈》&#xff08;ID&#xff1a;CSDNnews&#xff09; 在软件工程中&#xff0c;自动编程一直被视为圣杯。从编译器诞生时代开始&#xff0c;程序自动生成的目标就是将接近自然语言的高级语言翻译成低级语言&#xff0c;最终目标…

纯英文外刊原刊在哪看?怎么看?

.大家都知道&#xff0c;考研英语、雅思、托福、GRE中的文章很多都是来自外刊&#xff0c;它就是一个随机的阅读题库。选择哪些外刊作为备考资料很重要&#xff0c;下面几种外刊可以供大家参考。 时政经济类&#xff1a;经济学人&#xff08;the Economist&#xff09;、哈佛商…

有必要看考研英语外刊吗?

外刊是真题的替代品&#xff1f; 在真题数量有限且宝贵的当下&#xff0c;阅读题源外刊已经成为广大考生的不二之选。 但是这是否代表外刊就是真题的替代品呢&#xff1f;答案是否定的。 确定中心 考研是考试&#xff0c;考查方式是考生解题的能力。这就决定了我们在复习过程中…

外刊IT名人/名言

UNIX很简单。但需要有一定天赋的人才能理解这种简单。 –Dennis Ritchie 软件在能够复用前必须先能用。 –Ralph Johnson 优秀的判断力来自经验&#xff0c;但经验来自于错误的判断。 –Fred Brooks ‘理论’是你知道是这样&#xff0c;但它却不好用。‘实践’是它很好用&#…

【外刊】睡眠与减肥

思考 1.睡眠影响饮食习惯的哪些方面&#xff1f; 2.“导致”在英文中可以怎样表达&#xff1f; A fools bolt may sometimes hit the mark : 愚者千虑&#xff0c;必有一得 Can the way you sleep affect your eating habits? 你的睡眠方式会影响饮食习惯吗? 01:00 Mo…

6.22外刊打卡

《赖世雄讲英语》第26期:政治民意调意_品牌英语口语 - 可可英语http://www.kekenet.com/kouyu/201208/195943.shtml 转载于:https://www.cnblogs.com/wanghui626/p/9211747.html

必须关注的考研英语外刊公众号合集(不看后悔)

赶紧来看噢&#xff0c;不看你会后悔的。&#xff08;哈哈哈&#xff09; 文章不长&#xff0c;但绝对干货&#xff08;不信你就往下看&#xff09; 注意&#xff0c;这里我强烈建议你先点赞收藏&#xff0c;因为这里所推荐的所有资源都是我精心挑选并使用过的&#xff0c;错…

外刊逐句精读|《经济学人》:戒酒、吃素,禁食都有啥讲究?

The art of fasting In a season of abstinence, take a lesson from Ethiopia Short days, long nights, freezing temperatures, Christmas a swiftly fading memory and the prospect of spring remote—“the cruellest month” is not April, as T.S. Eliot wrote, but J…

外刊逐句精读|《金融时报》:亚马逊的官方水军

The perils of using staff as online influencers 正文&#xff1a; Others can learn from Amazon’s failed social media diplomacy Amazon has finally scrapped a campaign /to use paid “fulfilment centre ambassadors”/ to polish its image /on social media an…