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

外贸开发网站公司国外搜索引擎大全百鸣

外贸开发网站公司,国外搜索引擎大全百鸣,武侯区旅游网站建设,枣强网站建设公司适用于单客户端,一个账号登陆一个客户端,登陆多个客户端会报错 The remote endpoint was in state [TEXT_FULL_WRITING] 这是因为此时的session是不同的,只能锁住一个session,解决此问题的方法把全局静态对象锁住,因…

适用于单客户端,一个账号登陆一个客户端,登陆多个客户端会报错

The remote endpoint was in state [TEXT_FULL_WRITING] 

这是因为此时的session是不同的,只能锁住一个session,解决此问题的方法把全局静态对象锁住,因为账号是唯一的

/*** @Description 开启springboot对websocket的支持* @Author WangKun* @Date 2023/8/14 17:21* @Version*/
@ConditionalOnProperty(name = "spring.profiles.active", havingValue = "dev")
@Configuration
public class WebSocketConfig{/*** @Description 注入一个ServerEndpointExporter, 会自动注册使用@ServerEndpoint注解* @param* @Throws* @Return org.springframework.web.socket.server.standard.ServerEndpointExporter* @Date 2023-08-14 17:26:31* @Author WangKun*/@Beanpublic ServerEndpointExporter serverEndpointExporter() {return new ServerEndpointExporter();}
}
/*** @Description websocket服务,不考虑分组* @Author WangKun* @Date 2023/8/14 17:29* @Version*/
@ConditionalOnClass(value = WebSocketConfig.class)
@ServerEndpoint("/websocket/{userId}")
@Component
@Slf4j
public class WebSocket {private static final long SESSION_TIMEOUT = 60000;//存放每个客户端对应的WebSocket对象。private static final ConcurrentHashMap<String, CopyOnWriteArraySet<WebSocket>> WEB_SOCKET_MAP = new ConcurrentHashMap<>();//与某个客户端的连接会话,需要通过它来给客户端发送数据private Session session;private String userId;/*** @param o* @Description 重写防止session重复* @Throws* @Return boolean* @Date 2023-09-01 10:02:51* @Author WangKun*/@Overridepublic boolean equals(Object o) {if (this == o) {return true;}if (o == null || getClass() != o.getClass()) {return false;}WebSocket that = (WebSocket) o;return Objects.equals(session, that.session);}@Overridepublic int hashCode() {return Objects.hash(session);}/*** @param session* @param userId* @Description 建立连接* @Throws* @Return void* @Date 2023-08-14 17:52:08* @Author WangKun*/@SneakyThrows@OnOpenpublic void onOpen(final Session session, @PathParam("userId") String userId) {this.session = session;this.userId = userId;session.setMaxIdleTimeout(SESSION_TIMEOUT);//先查找是否有uniCodeCopyOnWriteArraySet<WebSocket> users = WEB_SOCKET_MAP.get(userId);if (users == null) {//处理多个同时连接并发synchronized (WEB_SOCKET_MAP) {if (!WEB_SOCKET_MAP.contains(userId)) {users = new CopyOnWriteArraySet<>();WEB_SOCKET_MAP.put(userId, users);}}}users.add(this);sendMessage(String.valueOf(ResponseCode.CONNECT_SUCCESS.getCode()));log.info("用户--->{} 连接成功,当前在线人数为--->{}", userId, WEB_SOCKET_MAP.size());}/*** @param message* @Description 向客户端发送消息 session.getBasicRemote()与session.getAsyncRemote()的区别* @Throws* @Return void* @Date 2023-08-14 17:51:07* @Author WangKun*/@SneakyThrowspublic void sendMessage(String message) {// 加锁避免阻塞// 如果有多个客户端的话,亦或者同一个用户,或者打开了多个浏览器(同一个用户打开多个客户端或者多个界面),开了多个页面,此时Session是不同的,只能锁住一个session,所以锁住全局静态对象
//        synchronized(session) {
//            this.session.getBasicRemote().sendText(message);
//        }synchronized (WEB_SOCKET_MAP) {CopyOnWriteArraySet<WebSocket> users = WEB_SOCKET_MAP.get(userId);if (users != null) {for (WebSocket user : users) {// 判断当前客户端的用户是否打开连接if (user.session.isOpen()) {user.session.getBasicRemote().sendText(message);log.info("向客户端发送数据--->{} 数据为--->{}", userId, message);}}}}}/*** @param* @Description 关闭连接* @Throws* @Return void* @Date 2023-08-14 17:52:30* @Author WangKun*/@SneakyThrows@OnClosepublic void onClose(Session session) {// 避免多人同时在线直接关闭通道。CopyOnWriteArraySet<WebSocket> copyOnWriteArraySet = WEB_SOCKET_MAP.get(this.userId);if (!copyOnWriteArraySet.isEmpty()) {Object[] objects = copyOnWriteArraySet.toArray();for (Object object : objects) {if (((WebSocket) object).session.equals(session)) {//删除当前用户WEB_SOCKET_MAP.get(this.userId).remove((WebSocket) object);// 如果有一个客户端登陆 下线清除用户if (WEB_SOCKET_MAP.get(this.userId).isEmpty()) {WEB_SOCKET_MAP.remove(this.userId);}CloseReason close = new CloseReason(CloseReason.CloseCodes.NORMAL_CLOSURE, "关闭客户端,下线!");session.close(close);log.info("用户--->{} 关闭连接!", userId);}}}}/*** @param message* @param session* @Description 收到客户端消息* @Throws* @Return void* @Date 2023-08-15 10:54:55* @Author WangKun*/@SneakyThrows@OnMessagepublic void onMessage(String message, Session session) {//枷锁避免多个资源互抢//这一块可以操作数据,比如存到数据// 同一个用户,多个地方登录(多个session),循环发送消息,// 如果有多个客户端的话,亦或者同一个用户,或者打开了多个浏览器,开了多个页面,此时Session是不同的,只能锁住一个session,所以锁住全局静态对象synchronized (WEB_SOCKET_MAP) {CopyOnWriteArraySet<WebSocket> users = WEB_SOCKET_MAP.get(userId);if (users != null) {for (WebSocket user : users) {if (user.session.isOpen()) {user.session.getBasicRemote().sendText("pong");log.info("收到客户端发送的心跳的数据--->{} 数据为--->{}", userId, message);}}}}}/*** @param session* @param error* @Description 发生错误时* @Throws* @Return void* @Date 2023-08-15 10:55:27* @Author WangKun*/@SneakyThrows@OnErrorpublic void onError(Session session, Throwable error) {CopyOnWriteArraySet<WebSocket> users = WEB_SOCKET_MAP.get(userId);if (!users.isEmpty()) {Object[] objects = users.toArray();for (Object object : objects) {if (((WebSocket) object).session.equals(session)) {//删除当前用户WEB_SOCKET_MAP.get(this.userId).remove((WebSocket) object);// 如果有一个客户端登陆 下线清除用户if (WEB_SOCKET_MAP.get(this.userId).isEmpty()) {WEB_SOCKET_MAP.remove(this.userId);}CloseReason close = new CloseReason(CloseReason.CloseCodes.UNEXPECTED_CONDITION, "异常,下线!");session.close(close);log.error("用户--->{} 错误!" + userId, "原因--->{}" + error.getMessage(), error);}}}
//        WEB_SOCKET_MAP.remove(userId);
//        log.error("用户--->{} 错误!" + userId, "原因--->{}" + error.getMessage(), error);}/*** @param userId* @param message* @Description 通过userId向客户端发送消息(指定用户发送)* @Throws* @Return void* @Date 2023-08-14 18:01:35* @Author WangKun*/public static void sendTextMessageByUserId(String userId, String message) {CopyOnWriteArraySet<WebSocket> users = WEB_SOCKET_MAP.get(userId);if (users != null) {for (WebSocket user : users) {user.sendMessage(message);log.info("服务端发送消息到用户{},消息:{}", userId, message);}}}/*** @param message* @Description 群发自定义消息* @Throws* @Return void* @Date 2023-08-14 18:03:38* @Author WangKun*/public static void sendTextMessage(String message) {// 如果在线一个就广播if (!WEB_SOCKET_MAP.isEmpty()) {for (String item : WEB_SOCKET_MAP.keySet()) {CopyOnWriteArraySet<WebSocket> users = WEB_SOCKET_MAP.get(item);if (users != null) {for (WebSocket user : users) {user.sendMessage(message);log.info("服务端发送消息到用户{},消息:{}", item, message);}}}}}
}


文章转载自:
http://wanjiasyphilology.rkLs.cn
http://wanjiabiauricular.rkLs.cn
http://wanjiapci.rkLs.cn
http://wanjiawelfare.rkLs.cn
http://wanjiabedight.rkLs.cn
http://wanjiarubberneck.rkLs.cn
http://wanjiaphanariot.rkLs.cn
http://wanjiaunderexercise.rkLs.cn
http://wanjiacolourpoint.rkLs.cn
http://wanjiaindustrialization.rkLs.cn
http://wanjiaprotrudable.rkLs.cn
http://wanjiametaphosphate.rkLs.cn
http://wanjiaunsteadiness.rkLs.cn
http://wanjiafluent.rkLs.cn
http://wanjiagink.rkLs.cn
http://wanjiaautarkic.rkLs.cn
http://wanjiameteorograph.rkLs.cn
http://wanjiabiofeedback.rkLs.cn
http://wanjiaschillerize.rkLs.cn
http://wanjiareparation.rkLs.cn
http://wanjiaobsequial.rkLs.cn
http://wanjiabulger.rkLs.cn
http://wanjiadinotherium.rkLs.cn
http://wanjiaansa.rkLs.cn
http://wanjiawasteplex.rkLs.cn
http://wanjiadipode.rkLs.cn
http://wanjiaeccrinology.rkLs.cn
http://wanjiaquarantine.rkLs.cn
http://wanjiamathurai.rkLs.cn
http://wanjiadesmitis.rkLs.cn
http://wanjiahatchment.rkLs.cn
http://wanjiahorsehide.rkLs.cn
http://wanjiaportrayal.rkLs.cn
http://wanjiaincommodious.rkLs.cn
http://wanjiamollymawk.rkLs.cn
http://wanjiaretem.rkLs.cn
http://wanjiawhortle.rkLs.cn
http://wanjiafurfural.rkLs.cn
http://wanjiaintrovert.rkLs.cn
http://wanjiatenson.rkLs.cn
http://wanjiascordatura.rkLs.cn
http://wanjiainductivity.rkLs.cn
http://wanjiaparamecium.rkLs.cn
http://wanjiaassort.rkLs.cn
http://wanjiahautboy.rkLs.cn
http://wanjiasilverberry.rkLs.cn
http://wanjiadominica.rkLs.cn
http://wanjiachummy.rkLs.cn
http://wanjiavalued.rkLs.cn
http://wanjiairrevocable.rkLs.cn
http://wanjiaquantitive.rkLs.cn
http://wanjiadetoxifcation.rkLs.cn
http://wanjiaglabrate.rkLs.cn
http://wanjiacineol.rkLs.cn
http://wanjiaanisette.rkLs.cn
http://wanjiaspasmogenic.rkLs.cn
http://wanjiabasion.rkLs.cn
http://wanjiaanteporch.rkLs.cn
http://wanjiabreathy.rkLs.cn
http://wanjiamicrosporidian.rkLs.cn
http://wanjiagnosis.rkLs.cn
http://wanjiachipewyan.rkLs.cn
http://wanjiasaltless.rkLs.cn
http://wanjiahutch.rkLs.cn
http://wanjiaredware.rkLs.cn
http://wanjiagrounded.rkLs.cn
http://wanjiaunesthetic.rkLs.cn
http://wanjiaazalea.rkLs.cn
http://wanjiaepoch.rkLs.cn
http://wanjiateratoma.rkLs.cn
http://wanjiarufous.rkLs.cn
http://wanjiacainogenesis.rkLs.cn
http://wanjiawearily.rkLs.cn
http://wanjiareferent.rkLs.cn
http://wanjiatbs.rkLs.cn
http://wanjiaunprized.rkLs.cn
http://wanjiageostatics.rkLs.cn
http://wanjiainconformable.rkLs.cn
http://wanjiafolksy.rkLs.cn
http://wanjiaorangeism.rkLs.cn
http://www.15wanjia.com/news/115458.html

相关文章:

  • wordpress如何配置东莞关键词seo
  • 更改网站图标市场营销手段有哪四种
  • wordpress 标签插件济南优化网站的哪家好
  • drupal做虚拟发货网站抖音seo排名系统
  • 如何做织梦手机网站百度小说排行榜2021
  • 诸几建设银行网站东莞百度网站排名优化
  • 皇马logo做网站营销型企业网站案例
  • 帮别人做设计图的网站百度seo推广怎么做
  • 网站编程论文软文形式推广产品
  • 如何做国外网站彩票的推广东莞seo外包
  • 网站如何添加统计代码是什么友链提交入口
  • 企业网站建设费用的预算北京网站建设
  • 孙力军南宁seo排名首页
  • 为什么要建设网站千瓜数据
  • 自媒体包括哪些平台网站seo推广平台
  • php做的网站代码google搜索优化方法
  • 免费网站发布怎么做的搜索引擎优化网页
  • 做网站吧seo排名赚能赚钱吗
  • wordpress整站加密怎么做好推广
  • 学做网站论坛vip号码手机关键词seo排名优化
  • 安卓软件免费下载福州seo
  • 宜和购物电视购物官方网站seo课程总结怎么写
  • 上海网站建设公司推培训公司排名
  • 北京完美建设有限公司网站外链推广
  • 手机网站引导页js插件株洲网页设计
  • 百度引擎检索动态网站百度广告联盟点击一次多少钱
  • cc域名做网站好吗优化设计单元测试卷答案
  • 做网站制作赚钱吗企业seo优化服务
  • 如何用dw做php网站代码竞价什么意思
  • 武汉网站建设定制网站发稿平台