当前位置: 首页 > news >正文

营销型企业网站有哪些类型/seo服务

营销型企业网站有哪些类型,seo服务,惠山网站建设,天津网站优化推广方案点击关注公众号,Java干货及时送达作者:南城之南 出处:www.cnblogs.com/liangshu/p/12459657.html前言考虑一个功能业务,在web程序中向指定的某个用户进行实时通讯在Web运用的Socket通讯功能中(如在线客服),为保证点对点通讯.而这个看似简单的…

点击关注公众号,Java干货及时送达

作者:南城之南
出处:www.cnblogs.com/liangshu/p/12459657.html

前言

考虑一个功能业务,在web程序中向指定的某个用户进行实时通讯

在Web运用的Socket通讯功能中(如在线客服),为保证点对点通讯.而这个看似简单的根据用户寻到起channel通道实际会碰到不少问题

  1. web程序中的Http协议是无状态的

  2. 一般项目中socket服务和web项目是独立部署的

  3. socket连接存在重连的情况,而Channel对象每次都不一样

  4. Channel是面向网卡绑定的,无法序列化

解决方案

通过管理一个线程安全的用户标识(如用户主键)和对应channelmap链表

private final ConcurrentHashMap<String, Channel> channelMap = new ConcurrentHashMap<>();

那么问题来了,

  • netty模块中怎么得到这个用户标识?

  • 又如何保证netty socket模块可以安全的识别某个通道属于某个用户?(这个可以像上面一样的方式解决)

  • nettysocket模块接收到一条消息又任何证明这条通道是可信的?

nett的实现中是没有认证也没有HttpSession这个东西的,也就是说.在netty程序线程中是无法得到web项目登录的用户情况的。另外,Netty 系列面试题和答案全部整理好了,微信搜索Java技术栈,在后台发送:面试,可以在线阅读。

出于这点,参考web项目集群的session共享方案.可以在Redis等缓存中保存登录信息.

  1. web项目中登录之后在redis中在这个以用户id为名的key中保存一个token,

  2. 在客户端socket通道建立之后立马发送包含一个用户标识ASKsocket服务端,

  3. 服务端根据ASK计算一个tokenredis比对.一旦比对成功,则绑定当前channel和用户之间的关系;

  4. 之后server每接收到一条消息就检测当前通道有没有绑定用户信息

这个key一次性的.这点非常重要,试想一下.在你前台项目可能因为cookie过期或者后台已经自动将该用户下线,而你的用户标识ASK暴露.那么就可能被恶意连接发送消息;

另外关于tokenASK之类的验证传输如果仅仅是为了识别和绑定用户与channel的关系,这点也是可以忽略的,只要redis中保存该用户的登录状态即可,通道建立的第一次通讯就传输当前浏览器的登录用户标识,再去redis中比对即可,但是redis中的这个key还是一次性的好,避免一个用户建立多条socket通道

正确的绑定通道Channel和用户之间的关系

如果我们仅仅有一个ConcurrentHashMap<String, Channel>,是无法快速优雅的判断当前channel是属于哪个用户的,我看到别人绝大多数的实现是在创建一个channelId用户标识的Map来管理。

//key为channel的长id,channel.id().asLongText();value为用户id
private final ConcurrentHashMap<String, String> channelAndUserMap = new ConcurrentHashMap<>();

其实这不是最合理的做法,正确的做法是利用Channel对象提供的AttributeMap来保存该通道的附带信息,很多人不知道Channel对象提供了一个绑定自定义数据的Map。

使用示例:

//用户id=>channel示例
private final ConcurrentHashMap<String, Channel> channelMap = new ConcurrentHashMap<>();/*** 判断一个通道是否有用户在使用* 可做信息转发时判断该通道是否合法* @param channel* @return*/
public boolean hasUser(Channel channel) {AttributeKey<String> key = AttributeKey.valueOf("user");return (channel.hasAttr(key) || channel.attr(key).get() != null);//netty移除了这个map的remove方法,这里的判断谨慎一点
}/*** 上线一个用户** @param channel* @param userId*/
public void online(Channel channel, String userId) {//先判断用户是否在web系统中登录?//这部分代码个人实现,参考上面redis中的验证this.channelMap.put(userId, channel);AttributeKey<String> key = AttributeKey.valueOf("user");channel.attr(key).set(userId);}/*** 根据用户id获取该用户的通道** @param userId* @return*/
public Channel getChannelByUserId(String userId) {return this.channelMap.get(userId);
}/*** 判断一个用户是否在线** @param userId* @return*/
public Boolean online(String userId) {return this.channelMap.containsKey(userId) && this.channelMap.get(userId) != null;
}

注意!!

很多人拿channel.id().asShortText()来记录标识channel,这是错误的!!!!!短id不保证全局唯一!!

另外,关注公众号Java技术栈,在后台回复:面试,可以获取我整理的 Java 系列面试题和答案,非常齐全。



关注Java技术栈看更多干货

获取 Spring Boot 实战笔记!

http://www.lbrq.cn/news/936361.html

相关文章:

  • 网站分享链接怎么做/发稿软文公司
  • 苏州知名网站制作设计/武汉百度信息流广告
  • 个人网站做推广/seo排名技巧
  • 辽宁建设工程信息网场内业绩/河南seo
  • 简述网站建设及维护全过程/推广运营
  • 网站编程语言/外国搜索引擎登录入口
  • 佛山做外贸网站流程/百度推广售后客服电话
  • 淘宝客wordpress末班/汕头seo优化
  • 做网站源码/汕头seo
  • 做水利网站需要多少钱/互联网宣传推广
  • 什么网站上可以做简历/爱站seo查询软件
  • 苏州网站建设网站/品牌推广渠道
  • 买房子上哪个网站最好/东莞网站优化公司
  • 手机排行榜/seo的优点有哪些
  • 微信小程序设计网站/汕头网站优化
  • 手机端怎么打开响应式的网站/码迷seo
  • 网站建设 关于我们/kol推广
  • 做网站主要来源/促销活动推广语言
  • 网站建设的基本规范有什么/网站建设公司苏州
  • 无锡网络公司网站建设/体球网足球世界杯
  • 民宿网站开发方案/网络seo啥意思
  • 高端视觉网站/怎样做品牌推广
  • seo网站优化报价/网站域名备案查询
  • 网站 刷流量/360收录提交入口网址
  • 播放视频网站怎么做/电脑清理优化大师
  • 做一元购网站会被封吗/网络平台怎么推广
  • 潜江资讯网二手房出售/优化方案官方网站
  • 网站后台程序怎么做/seo工具查询
  • 学营销app哪个更好/长沙seo网站管理
  • 漳州网站建设公司/什么平台免费推广效果最好
  • 分割回文串(回溯算法)
  • MOGA(多目标遗传算法)求解 ZDT1 双目标优化问题
  • 智能编队重构职场生态:Agentic AI 协同时代来临
  • Pandas 里的分箱操作
  • 四、计算机组成原理——第4章:指令系统
  • window显示驱动开发—Direct3D 11 视频设备驱动程序接口 (DDI)