花了20分钟,给女朋友们写了一个web版群聊程序

article/2025/11/10 1:15:59

WebSocket详解

在这里插入图片描述

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

WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。可以说WebSocket的出现,使得浏览器具备了实时双向通信的能力

在 WebSocket API 中,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。

原来为了实现推送,很多公司用的是Ajax 轮询,即按照特定的时间间隔,由浏览器对服务器发出HTTP请求,然后由服务器返回最新的数据给客户端的浏览器。这种传统的模式带来很明显的缺点,即浏览器需要不断的向服务器发出请求,然而HTTP请求可能包含较长的头部,其中真正有效的数据可能只是很小的一部分,显然这样会浪费很多的带宽等资源。而websocket就可以解决这些问题。

在Spring Boot中使用WebSocket

1.pom文件增加依赖

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

2.增加配置

@Configuration
public class WebSocketConfig {@Beanpublic ServerEndpointExporter serverEndpointExporter() {return new ServerEndpointExporter();}}

3.Java代码

@Component
@ServerEndpoint("/websocket")
public class WebSocketServerController {// 收到消息调用的方法@OnMessagepublic void onMessage(String message) {System.out.println("收到的消息为 " + message);}// 建立连接调用的方法@OnOpenpublic void onOpen() {System.out.println("Client connected");}// 关闭连接调用的方法@OnClosepublic void onClose() {System.out.println("Connection closed");}// 传输消息错误调用的方法@OnErrorpublic void OnError(Throwable error) {System.out.println("Connection error");}
}

4.前端代码

<!DOCTYPE html>
<html>
<head>
<title>Testing websockets</title>
</head>
<body><div><textarea rows="3" cols="20" id="content"></textarea><br><input type="submit" value="Start" onclick="start()" /></div><div id="messages"></div><script type="text/javascript">var webSocket = new WebSocket('ws://localhost:8080/websocket');webSocket.onerror = function(event) {onError(event)};webSocket.onopen = function(event) {onOpen(event)};webSocket.onmessage = function(event) {onMessage(event)};webSocket.onclose = function(event) {onClose(event)};function onMessage(event) {document.getElementById('messages').innerHTML += '<br />' + event.data;}function onOpen(event) {document.getElementById('messages').innerHTML = 'Connection established';}function onError(event) {alert(event);}function onClose(event) {alert(event);}function start() {var text = document.getElementById('content').value;webSocket.send(text);}</script>
</body>
</html>

所以你看websocket其实很简单,前后端各写4个事件方法就行了(当然你也可以省略一些方法)

1.建立连接
2.收到消息
3.传输消息失败
4.关闭连接

事件和具体会话关联

如果事件想和具体会话关联,方法上只要加Session参数就行(4种事件类型的方法上都可加)

举个例子,直接将用户发送给服务端的话再返回给客户端

// 收到消息调用的方法
@OnMessage
public void onMessage(Session session, String message) {try {session.getBasicRemote().sendText(message);} catch (IOException e) {e.printStackTrace();}
}

在这里插入图片描述
传递参数

方法上加@PathParam参数即可

@Component
@ServerEndpoint("/websocket/{sid}")
public class WebSocketServerController
@OnOpen
public void onOpen(@PathParam("sid") String sid) {System.out.println("Client connected");
}

实现一个在线群聊

后端接口

@Slf4j
@Component
@ServerEndpoint("/groupChat/{sid}/{username}")
public class GroupChatController {// 保存 组id->组成员 的映射关系private static ConcurrentHashMap<String, List<Session>> groupMemberInfoMap = new ConcurrentHashMap<>();// 收到消息调用的方法,群成员发送消息@OnMessagepublic void onMessage(@PathParam("sid") String sid,@PathParam("username") String username, String message) {List<Session> sessionList = groupMemberInfoMap.get(sid);// 先一个群组内的成员发送消息sessionList.forEach(item -> {try {String text = username + ": " + message;item.getBasicRemote().sendText(text);} catch (IOException e) {e.printStackTrace();}});}// 建立连接调用的方法,群成员加入@OnOpenpublic void onOpen(Session session, @PathParam("sid") String sid) {List<Session> sessionList = groupMemberInfoMap.get(sid);if (sessionList == null) {sessionList = new ArrayList<>();groupMemberInfoMap.put(sid,sessionList);}sessionList.add(session);log.info("Connection connected");log.info("sid: {}, sessionList size: {}", sid, sessionList.size());}// 关闭连接调用的方法,群成员退出@OnClosepublic void onClose(Session session, @PathParam("sid") String sid) {List<Session> sessionList = groupMemberInfoMap.get(sid);sessionList.remove(session);log.info("Connection closed");log.info("sid: {}, sessionList size: {}", sid, sessionList.size());}// 传输消息错误调用的方法@OnErrorpublic void OnError(Throwable error) {log.info("Connection error");}
}

前端代码很简单,放github了
地址为:https://github.com/erlieStar/spring-boot-websocket

下面来看效果
在这里插入图片描述
注意先连接,后发送
在这里插入图片描述
在线开房地址:
http://www.javashitang.com:8090/

欢迎关注

在这里插入图片描述

参考博客

好文
[1]https://blog.csdn.net/moshowgame/article/details/80275084
[2]https://www.jianshu.com/p/d79bf8174196
[3]https://www.byteslounge.com/tutorials/java-ee-html5-websocket-example
一个群聊程序
[4]https://blog.csdn.net/moshowgame/article/details/80275084


http://chatgpt.dhexx.cn/article/hOl2elGt.shtml

相关文章

外国人最习惯用的社交软件有哪些?

说到国外的社交软件&#xff0c;你的认知是否还只停留在Facebook上&#xff1f;今天带大家来看一看不同国家都用哪些社交软件。方便外贸人和各国客户沟通时&#xff0c;选择正确的社交软件&#xff0c;并掌握外贸必备的社媒营销技能。 相信现在每个人与世界的联系很大都是靠手机…

使用Python制作学习英语软件

前言&#xff1a; 由于Python考试临近&#xff0c;加上平时要学习英语&#xff0c;突发奇想制作一款和手机上app那样的记单词的简单软件&#xff0c;顺便复习一下Python。 步骤&#xff1a; 编辑一个保存单词的txt文档读取txt文件&#xff0c;制作成字典使用tkinter制作界面使…

外贸沟通中,老外最喜欢的聊天工具你了解?各国客户最常用的即时聊天APP整理及配套8个英语类工具推荐

作为外贸人&#xff0c;不要一味的跟客人谈生意&#xff0c;当然目的是这个。私下的问候&#xff0c;关心&#xff0c;沟通也是不可或缺的。很多老外不喜欢来回发邮件&#xff0c;那样速度慢&#xff0c;还得来回查看&#xff0c;因此很多在线的聊天工具就备受欢迎。 下面给大家…

计算机专业3分钟演讲能讲什么,面试三分钟演讲稿范文

面试三分钟演讲稿范文 20XX年4月26日至28日&#xff0c;我在华南师范大学网络学院参加了全国高校教师网络培训——同济大学龚沛曾教授团队主持的《大学计算机基础》全国精品课程网络培训&#xff0c;受益匪浅。龚沛曾教授讲授的《大学计算机基础》之计算机基础课程体系、计算机…

记一次技术分享演讲

**丨**版权说明 : 《记一次技术分享演讲》于当前CSDN博客和乘月网属同一原创&#xff0c;转载请说明出处&#xff0c;谢谢。 本文仅谈心得&#xff0c;不谈技术 谈谈为什么写心得 笔者自入学到现在工作已有20余载&#xff0c;虽然沉淀的文笔贫平&#xff0c;可也写过数篇作文&…

俞敏洪一分钟励志演讲稿

俞敏洪一分钟励志演讲稿 人的生活方式有两种&#xff0c; 第一种方式是像草一样活着&#xff0c; 你尽管活着&#xff0c;每年还在成长&#xff0c; 但是你毕竟是一棵草&#xff0c; 你吸收雨露阳光&#xff0c; 但是长不大&#xff0c; 人们可以踩过你&#xff0c; 但是人们不…

计算机基本知识3分钟演讲稿,3分钟演讲稿范文(精选3篇)

3分钟演讲稿范文(精选3篇) 演讲稿要求内容充实&#xff0c;条理清楚&#xff0c;重点突出。在社会一步步向前发展的今天&#xff0c;能够利用到演讲稿的场合越来越多&#xff0c;那么你有了解过演讲稿吗&#xff1f;下面是小编精心整理的3分钟演讲稿范文(精选3篇)&#xff0c;希…

Android4.3 Google Pinyin输入法UI定制

Android4.3 Google Pinyin输入法UI定制 先来看原版输入法的效果如下&#xff1a; 定制后的效果如下&#xff1a; SystemServer会启动InputMethodManagerService&#xff0c;在InputMethodManagerService中会启动action为"android.view.InputMethod"的Service&#x…

学习双拼必看:双拼输入法的心得以及快速入门办法

1.简单介绍一下双拼 2.总共18种双拼方案 3.15种双拼方案的具体映射 4.顺便提一下双拼口诀的事情 5.总结不同平台选择的方案 双拼&#xff08;也称双打&#xff09;是一种建立在拼音输入法基础上的输入方法&#xff0c;可视为全拼的一种改进&#xff0c;它通过将汉语拼音中每…

Qt编写可换肤的中文双拼汉字输入法

新版本&#xff1a; https://qtchina.blog.csdn.net/article/details/103945421 时间过得真快&#xff0c;不知不觉已到2015年&#xff0c;农历春节一眨眼就过去了&#xff0c;端正状态收拾心情整装待发出发。 曾经有段时间&#xff0c;我有一个很执着的梦想&#xff0c;我要…

Android仿微信聊天UI之处理软键盘抬升问题

前言&#xff0c;效果图 本文介绍如何解决软键盘遮挡问题&#xff0c;以下是仿微信聊天界面所制作的效果图&#xff1a; 一、ViewTreeObserver ViewTreeObserver&#xff0c;很明显通过名字就可以了解到它是View树的观察者。该类不能被实例化&#xff0c;但可以通过视图获取&…

解决手机端微信公众号内input输入框获取焦点后,底部导航栏显示在输入法软键盘上面的问题

今天遇到在微信公众号中打开网站,input 输入框和textarea输入框获取焦点后&#xff0c;弹出输入法键盘&#xff0c;将底部的导航栏”顶到“输入法键盘上面的问题&#xff0c;看着非常shit&#xff01; 直接上代码看效果 var clientHeight document.documentElement.clientHei…

教你在Windows自带的微软拼音输入法中用上小鹤双拼方案

微软拼音输入法是Windows 10操作系统中自带的输入法&#xff0c;虽然很多人在拿到一个新系统之后就安装一个新的输入法&#xff0c;比如搜狗输入法、手心输入法。但是很多人不知道最新版本的windows操作系统自带的微软拼音输入法&#xff0c;已经不像是以前windows 7操作系统的…

不甘心只做输入工具,搜狗输入法上线AI助手,提供智能服务

8月19日搜狗输入法上线了新功能——智能汪仔&#xff0c;在输入法中引入了AI助手&#xff0c;这是搜狗输入法继今年5月推出“语音变声功能”后又一个AI落地产品。 有了智能汪仔AI助手的加持后&#xff0c;搜狗输入法能够在不同的聊天场景&#xff0c;提供丰富多样的表达方式从…

524MB的微信输入法:没广告 你会用吗

&#x1f447;&#x1f447;关注后回复 “进群” &#xff0c;拉你进程序员交流群&#x1f447;&#x1f447; 来源丨 扩展迷EXTFANS https://mp.weixin.qq.com/s/asRqVjbn0lf8BmDnGY9Zig 相信很多小伙伴都有过这样的经历&#xff1a;和朋友聊天讨论某件东西&#xff0c;打开其…

Android之仿微信QQ聊天顶起输入法不顶起标题栏

在这记录一下输入法弹出的一系列问题&#xff0c;有的输入法弹出就把整个布局弹上去&#xff0c;有的输入法弹出布局不会有变化&#xff0c;有的输入法弹出遮盖输入框等等问题&#xff0c;网上也有很多说加着加那的&#xff0c;但是看一下都不是很完整&#xff0c;解决不了所有…

刚才发现微软拼音-简洁2010是目前比较适合程序员的输入法

微软拼音-简洁2010&#xff0c;在中文状态下&#xff0c;按 //&#xff0c;打出来就是 // 可是 百度输入法&#xff0c;QQ输入法、搜狗输入法 在中文状态下&#xff0c;按 //&#xff0c;打出来的都是 、、 这样写注释就麻烦了&#xff0c;还得切换成英文状态。 微软拼音-新体…

Qt5软键盘实现中文拼音输入法

一、序 基于Qt实现的虚拟键盘实现输入法在网上所有资料看来&#xff0c;几乎都是基于生成的中文汉字数据库实现的方法&#xff0c;不够灵活&#xff0c;不够智能。 二、实现 1、拼音输入法的库 我们采用的安卓底层的谷歌拼音输入法&#xff0c;在Qt5.7之后&#xff0c;Qt官方…

实现ucGUI界面中的拼音汉字输入法(T9)

实现ucGUI界面中的汉字输入法 ucGUI版本&#xff1a;3.94 上个图片 代码下载地址&#xff1a; http://download.csdn.net/detail/jhting/7034669 很久了&#xff0c;可能直接编译不过&#xff0c;不过你了解的话&#xff0c;小小改动就OK了 码表是在网上找到的. 主要三个…

微信小程序实现调用百度文心一言接口API(可直接运行代码)

1、首先得获得你自己的API_key 先进入文心千帆大模型平台&#xff0c;然后点击左边一列的“应用接入”&#xff0c;然后点创建应用&#xff0c;这时你就获得了API_key了。 2、第二部就直接上这段代码就ok&#xff0c;不过记得要换成自己的API_key和Secret_key。 Page({onLoad:…