WebSocket服务端

  • WebSocket服务端配置类
  • 服务端代码

WebSocket服务端配置类

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Service;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;/*** websocket配置类* @author daiyg* @date 2021/8/24 17:19*/
@Service
@Configuration
@EnableWebSocket
public class WebSocketConfig {@Beanpublic ServerEndpointExporter serverEndpointExporter(){return new ServerEndpointExporter();}
}

服务端代码

import com.caso.common.core.utils.StringUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.stereotype.Component;import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;/*** @author daiyg* @date 2021/8/24 18:15*/
@Component
@ServerEndpoint(value = "/websocket/{id}/{key}", subprotocols = {"protocol"})
public class WebSocketServer {private static int onlineCount = 0;private static ConcurrentHashMap<String, WebSocketServer> webSocketSet = new ConcurrentHashMap<>();private static  ConcurrentHashMap<String, List<String>> map = new ConcurrentHashMap<>();//与某个客户端的连接会话,需要通过它来给客户端发送数据private Session session;private static Logger log = LogManager.getLogger(WebSocketServer.class);private String id = "";private String key= "";/*** 连接建立成功调用的方法*/@OnOpenpublic void onOpen(@PathParam(value = "id") String id,@PathParam("key") String key, Session session) {this.session = session;this.id = id;//接收到发送消息的人员编号this.key = key;if ("1".equals(id)) {log.info("非门岗用户连接!");} else {List<String> ids = new ArrayList<>();ids = map.get(id);if(StringUtils.isEmpty(ids)){ids = new ArrayList<>();}ids.add(key);map.put(id,ids);webSocketSet.put(key, this);     //加入set中}addOnlineCount();           //在线数加1log.info("用户" + id + "连接成功!当前在线人数为" + getOnlineCount());try {sendMessage("连接成功");} catch (IOException e) {log.error("websocket IO异常");}}/*** 连接关闭调用的方法*/@OnClosepublic void onClose() {//删除map中值List<String> keys = map.get(this.id);for (int i = 0; i < keys.size(); i++) {if(this.key.equals(keys.get(i))){keys.remove(i);i--;}}webSocketSet.remove(this.key);  //从set中删除subOnlineCount();           //在线数减1log.info("有一连接关闭!当前在线人数为" + getOnlineCount());}/*** 收到客户端消息后调用的方法** @param message 客户端发送过来的消息*/@OnMessagepublic void onMessage(String message) {log.info("来自客户端的消息:" + message);}/*** @param session* @param error*/@OnErrorpublic void onError(Session session, Throwable error) {log.error("发生错误");try {session.close();} catch (IOException e) {e.printStackTrace();}error.printStackTrace();}/*** 服务端主动推送消息** @param message* @throws IOException*/public void sendMessage(String message) throws IOException {this.session.getBasicRemote().sendText(message);}/*** 发送信息给指定ID用户,如果用户不在线则返回不在线信息给自己** @param message* @param personKeys* @throws IOException*/public static void sendtoUser(String message, String[] personKeys) throws IOException {//获取人员集合for (String personKey : personKeys) {//获取map中对应的链接if (map.get(personKey) != null && StringUtils.isNotEmpty(map.get(personKey))) {//遍历给连接人发送信息for(String s : map.get(personKey)){webSocketSet.get(s).sendMessage(message);}} else {//如果用户不在线则返回不在线信息给自己log.error("当前用户不在线:" + personKey);}}}/*** 发送信息给所有人** @param* @throws IOException*/public void sendtoAll(String message) throws IOException {for (String key : webSocketSet.keySet()) {try {webSocketSet.get(key).sendMessage(message);} catch (IOException e) {e.printStackTrace();}}}public static synchronized int getOnlineCount() {return onlineCount;}public static synchronized void addOnlineCount() {WebSocketServer.onlineCount++;}public static synchronized void subOnlineCount() {WebSocketServer.onlineCount--;}}

java实现WebSocket服务端相关推荐

  1. 基于Redisson实现的延时队列RedissonDelayedQueue实现websocket服务端心跳监听

    简介 基于Redis的Redisson分布式延迟队列(Delayed Queue)结构的 RDelayedQueue. Java对象在实现了RQueue接口的基础上提供了向队列按要求延迟添加项目的功能 ...

  2. websocket服务端和html客户端进行二进制数据交互

    一.概念和理论理解 1.HTTP HTTP 是基于请求响应式的,即通信只能由客户端发起,服务端做出响应,无状态,无连接. 无状态:每次连接只处理一个请求,请求结束后断开连接. 无连接:对于事务处理没有 ...

  3. 推广下自己的JAVA开源游戏服务端框架

    Carmelo是基于Java的游戏服务端框架,适合于页游和手游.它的主要特点是: 利用Netty实现高效的NIO通信,同时支持TCP/HTTP协议 完善的三层架构模型,易扩展 通用.完善的sessio ...

  4. Android搭建WebSocket服务端

    WebSocket简介 WebSocket协议是基于TCP的一种新的网络协议.它实现了浏览器与服务器全双工(full-duplex)通信--允许服务器主动发送信息给客户端.全双工就是指客户端和服务端可 ...

  5. 基于springboot的websocket服务端和客户端demo(简单易上手)

    jdk 1.8 1.导入maven依赖 <!-- websocket服务端依赖 --> <dependency><groupId>org.springframewo ...

  6. Spring boot 实现 WebSocket服务端

    Spring boot 实现 WebSocket服务端 这里写目录标题 Spring boot 实现 WebSocket服务端 声明 准备工作 1. 配置 2. WebSocket服务类 3. 编写客 ...

  7. Java:socket服务端,socket服务端支持多连接,socket客户端,socket客户端支持发送和接受

    一.Java之socket服务端 新建一个Java工程 命名 给他先创建一个类 在类里面我们做一个main 这里面也需要,创建套接字,IP号,端口号 但是java中有一个类         Serve ...

  8. Qt WebSocket服务端的简单Demo

    WebSocket服务端:QWebSocketServer 目录 WebSocket服务端:QWebSocketServer **背景**: **QWebSocketServer 简单使用介绍:** ...

  9. python 3.5.2页面_Python 3.5.2实现websocket服务端

    最近由于一个项目需要,写了一个简易的websocket服务端程序,其间也参考了网上的很多资料,我将用接下来的几个篇幅说明是怎么实现的,及遇到的一系列埂. 参考 (包括且不限于如下地址) 涉及到的模块 ...

最新文章

  1. 磁盘文件目录罗列和list控件的使用
  2. 快速入门系列--MVC--03控制器和IOC应用
  3. 支付业务流程--h5、APP
  4. linux netstat服务,linux netstat查看服务和端口状态
  5. 从零开始学Pytorch(十四)之优化算法进阶
  6. Python 100道题深入理解
  7. WPS无法使用复制粘贴快捷键
  8. input输入框历史记录清除
  9. html 中数字一直往上加的动态效果,CSS动画:数字增量效果
  10. oracle从11.0.2.4.0打PSU 11.0.2.4.8
  11. 离散数学 (上)小结
  12. 易捷文件共享web服务器 v3.5,易捷文件共享Web服务器 官方版
  13. 照片的35x45,300dpi怎么弄
  14. 线程死锁 导致 服务器cpu负载过高
  15. Linux虚拟机遇到的一些问题
  16. Searchable Encryption for Healthcare Clouds:A Survey 翻译
  17. 环形队列、 条带环形队列 Striped-RingBuffer (史上最全)
  18. ppt中的面积显示图表中有数据被盖住了显示不出来_关于PPT图表的用法,看这一篇就够了...
  19. C# GroupBy 用法
  20. C++学习(四八三)无法从“std::pair<const _Kty,_Ty>”转换为“_Objty”

热门文章

  1. 写给普通人看的自媒体分享|万事开头难,勇于分享自己,我们都很棒!
  2. 析取 为什么是并集 合取
  3. 怎么成为一个合格的ERP系统管理员
  4. 苏宁不蹭618,造了一个“宝宝节”
  5. 欧美市场独立站选品技巧
  6. 必做作业2:视频剪辑软件调研
  7. 全媒社:媒体报道宣传和渠道选择有密切关联
  8. 智慧养老解决方案探索养老行业新方向-新导智能
  9. linux c语言 fork() 和 exec 函数的简介和用法
  10. 简述什么是 Cloud Native 1