96SEO 2026-02-19 18:02 19
消息源服务的消息不能直接推给用户侧用户与中间服务建立websocket连接中间服务再与源服务建立websocket连接源服务的消息推给中间服务中间服务再将消息推送给用户。

流程如下图
此例中我们定义中间服务A的端口为8082消息源头服务B的端口为8081方便阅读下面代码。
说明此例子只实现了中间服务的转发连接的关闭等其他逻辑并没有完善如需要请自行完善
中间服务即为上图的中间服务A由于中间服务既要发送发给用户端消息又要接收从消息源服务B接收消息故服务A分为服务端与客户端。
websocket实现客户端使用okhttp实现会话缓存暂使用内存缓存实际项目中可置于其他缓存中
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-websocket/artifactId
dependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactId
dependencygroupIdcom.squareup.okhttp3/groupIdartifactIdokhttp/artifactIdversion4.2.2/version
ConcurrentHashMap();//存储把不同用户的客户端session信息集合
[会话id1,会话id2,会话id3,会话id4]}public
massage;//为userId用于从缓存中获取对应用户的websocket
response.body().string());}/***
收到源8081的消息取到对应userId的消息并将消息通过本地server发送给用户ObjectMapper
WSCache.connection.get(msgInfo.getUserKey());if(!CollectionUtils.isEmpty(strings)){for
WSCache.clients.get(sid);session.getBasicRemote().sendText(msgInfo.getMassage());}}}
RuntimeException(e);}}Overridepublic
ServerEndpoint(/notice/{userId})
UUID.randomUUID().toString();this.userId
userId;WSCache.clients.put(this.sid,session);//判断该用户是否存在会话信息不存在则添加SetString
WSCache.connection.get(userId);if
(CollectionUtils.isEmpty(clientSet)){clientSet
HashSet();clientSet.add(this.sid);}else
{clientSet.add(this.sid);}WSCache.connection.put(userId,clientSet);log.info(用户{}与本地8082server建立连接,
Request.Builder().url(ws://127.0.0.1:8081/api/notice/
OkHttpClient.Builder().build();WebSocket
webSocketClientRemote.newWebSocket(requestRemote,
CommonWSClient());log.info(本地server创建本地client且本地client与远程8082server连接成功);return
onClose(){WSCache.clients.remove(this.sid);System.out.println(this.sid连接断开);}/***
当收到client发送的消息时执行该方法**/OnMessagepublic
{System.out.println(-----------收到来自用户
error){System.out.println(error--------系统错误);error.printStackTrace();}
serverEndpointExporter(){return
消息源服务B只需要websocket服务用来发送消息即可其实现与中间服务A的服务端相同。
ServerEndpoint(/notice/{userId})
ConcurrentHashMap();//存储把不同用户的客户端session信息集合
[会话id1,会话id2,会话id3,会话id4]}public
ConcurrentHashMap();//会话idprivate
userId){log.info(onOpen--session.getRequestParameterMap():{},
session.getRequestParameterMap());this.sid
UUID.randomUUID().toString();this.userId
userId;clients.put(this.sid,session);//判断该用户是否存在会话信息不存在则添加SetString
HashSet();connection.put(userId,clientSet);}clientSet.add(this.sid);System.out.println(this.userId
onClose(){clients.remove(this.sid);System.out.println(this.sid连接断开);}/***
当收到客户端发送的消息时执行该方法**/OnMessagepublic
{System.out.println(-----------收到来自用户
MsgInfo().setUserKey(this.userId).setMassage(服务端-
message);sendMessageByUserId(this.userId,
error){System.out.println(error--------系统错误);error.printStackTrace();}/***
connection.get(userId);//用户是否存在客户端连接if
{//同步发送数据需要等上一个sendText发送完成才执行下一个发送ObjectMapper
ObjectMapper();session.getBasicRemote().sendText(mapper.writeValueAsString(msgInfo));}
{e.printStackTrace();}}}}}}Scheduled(cron
testSendMessageByCron(){log.info(-----------模拟消息开始发送--------------);//模拟两个用户100和200MsgInfo
MsgInfo().setUserKey(100).setMassage(这是8081发给用户100的消息
System.currentTimeMillis());sendMessageByUserId(100,
MsgInfo().setUserKey(200).setMassage(这是8081发给用户200的消息
System.currentTimeMillis());sendMessageByUserId(200,
打开两个该工具窗口分别模拟用户100和用户200这两个用户都连接中间服务A端口8082的服务
我们模拟的消息发送已经在给用户100和用户200发送因为我们的用户100和用户200均没有与中间服务A建立连接故此时测试界面看不到消息
当我们在用户100的模拟界面点击“开启连接”后可以在右侧看到发给用户100的模拟消息
好了到这里就结束了有任何问题请积极指出此例子只是个例子并未经受任何生产的测试欢迎讨论沟通
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback