java websocket详细
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
一:先导入上面的jar
二:放入websocket 相关配置代码
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.concurrent.CopyOnWriteArraySet;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; /**
* 因为WebSocket是类似客户端服务端的形式(采用ws协议),那么这里的WebSocketServer其实就相当于一个ws协议的Controller
* 直接@ServerEndpoint("/websocket")@Component启用即可,然后在里面实现@OnOpen,@onClose,@onMessage等方法
*
* @author Admin
*/
@ServerEndpoint("/shdxmh/websocket/{deptId}")
@Component
@RestController
public class WebSocketAction { private static Logger logger = LoggerFactory.getLogger(WebSocketAction.class); /**
* 静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。
*/
private static int onlineCount = 0; /**
* concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。
*/
private static CopyOnWriteArraySet<WebSocketAction> webSocketSet = new CopyOnWriteArraySet<WebSocketAction>(); /**
* 与某个客户端的连接会话,需要通过它来给客户端发送数据
*/
private Session session; /**
* 接收sid
*/
private String deptId = ""; private static ExecutorService executorService = Executors.newFixedThreadPool(10); /**
* 连接建立成功调用的方法
*
* @param deptId 唯一性ID
* @param session socket session
* @return void
*/
@OnOpen
public void onOpen(@PathParam("deptId") String deptId, Session session) {
this.session = session;
//加入set中
webSocketSet.add(this); //添加在线人数
addOnlineCount();
this.deptId = deptId;
// logger.info("新连接接入,deptId={}, sessionId={}, 当前在线人数为:{}", this.deptId, session.getId(), getOnlineCount());
} /**
* 连接关闭调用的方法
*/
@OnClose
public void onClose(Session session) {
//从set中删除
webSocketSet.remove(this);
//在线数减1
subOnlineCount();
// logger.info("有连接关闭, sessionId={}。当前在线人数为:{}", session.getId(), getOnlineCount());
} /**
* 暴露给外部的群发
*
* @param message
* @throws IOException
*/
@RequestMapping("/websocket-send")
public static void sendInfo(String message, @PathParam("deptId") String deptId) {
executorService.execute(() -> {
logger.info("推送消息到窗口" + deptId + ",推送内容:" + message);
for (WebSocketAction item : webSocketSet) {
try {
//这里可以设定只推送给这个sid的,为null则全部推送
if (deptId == null) {
item.sendMessage(message);
}
//点对点推送
else if (item.deptId.equals(deptId)) {
item.sendMessage(message);
}
} catch (IOException e) {
logger.error("推送异常", e);
}
}
});
} /**
* 群发
*
* @param message
*/
private static void sendAll(String message) { for (WebSocketAction webSocketAction : webSocketSet) {
try {
webSocketAction.sendMessage(message);
} catch (IOException e) {
logger.error("群发异常", e);
}
}
} /**
* 发生错误时调用
*
* @param session
* @param error
*/
@OnError
public void onError(Session session, Throwable error) {
logger.error("websocket异常, sessionId={}",session.getId(), error);
} /**
* 减少在线人数
*/
private synchronized static void subOnlineCount() {
WebSocketAction.onlineCount--;
} /**
* 添加在线人数
*/
private synchronized static void addOnlineCount() {
WebSocketAction.onlineCount++;
} /**
* 当前在线人数
*
* @return 在线人数
*/
public int getOnlineCount() {
return onlineCount;
} /**
* 发送信息实现服务器主动推送信息
*
* @param message
* @throws IOException
*/
public void sendMessage(String message) throws IOException {
// logger.info("发送消息, message={}", message);
//获取session远程基本连接发送文本消息
// tomcat有bug, 多个线程向一个socket写数据会冲突 报IllegalStateException...[TEXT_FULL_WRITING], 故此处加锁和使用getBasicRemote
synchronized (this.session) {
this.session.getBasicRemote().sendText(message);
}
// session.getAsyncRemote().sendText(message); } /**
* 群发
*南桥引入
* @param message
*/
public static void sendAllMsg(String message) { for (WebSocketAction webSocketAction : webSocketSet) {
try {
webSocketAction.sendMessage(message);
} catch (IOException e) {
logger.error("群发异常", e);
}
}
} }
三:浏览器连上websocket 充当客户端

四:postman 调用后台接口发送信息

完活!其他方法自己看。
java websocket详细的更多相关文章
- Java log4j详细教程
Java log4j详细教程 http://www.jb51.net/article/74475.htm
- 使用Jetty搭建Java Websocket Server,实现图像传输
https://my.oschina.net/yushulx/blog/298140 How to Implement a Java WebSocket Server for Image Transm ...
- Java WebSocket 线程安全的保证
Java WebSocket线程安全基于3点: 1 在新的客户端连接时,WebSocket容器会创建一个新的端点实例,对应的会话实例表示从唯一的客户端到该端点实例的唯一连接. 2 每个WebSocke ...
- Java WebSocket HttpSession与WebSocket Session的关联
当HttpSession中止(通过显示地失效或超时)时,Web容器会把HttpSession属性从HttpSession中清除. javax.servlet.http.HttpSessionBindi ...
- java websocket学习
引言: websocket,webservice傻傻分不清楚,都觉得是很高深的东西,理解中的webservice是一种协议,通信协议,类似http协议的那种,比如使用webservice协议调后台接口 ...
- java websocket开发的客户端程序
最近用java websocket开发的客户端程序,在和服务端链接通后,在数据传输完毕后,客户端自动关闭了链接,如何能保持链接不断开 这个是客户端的启动类,在循环完毕后,会自动断开和服务器的链接,开始 ...
- java agent 详细介绍 -javaagent参数
java agent 详细介绍 简介 java agent是java命令的一个参数.参数 javaagent 可以用于指定一个 jar 包,并且对该 java 包有2个要求: 这个 jar 包的MAN ...
- java WebSocket Demo
1.IDEA创建Module,结构如图(Tomcat8.0) 2.引入jar包:javax.websocket-api.jar 3.新建WebSocketTest类 import javax.webs ...
- JAVA HashMap详细介绍和示例
http://www.jb51.net/article/42769.htm 我们先对HashMap有个整体认识,然后再学习它的源码,最后再通过实例来学会使用HashMap. 第1部分 HashMa ...
- Java EL 详细用法讲解
本文主要介绍了Java EL的语法结构以及EL的使用方法,并结合例子代码讲解了Java EL对象.Java EL运算符以及Java EL函数.希望对Java开发者有所帮助. 一.EL简介 1.语法结构 ...
随机推荐
- Linuxt通过命令lsof或者extundelete工具恢复误删除的文件或者目录
Linux不像windows有那么显眼的回收站,不是简单的还原就可以了.linux删除文件还原可以分为两种情况,一种是删除以后在进程存在删除信息,一种是删除以后进程都找不到,只有借助于工具还原.这里分 ...
- PHP二维数组根据某个元素(key)排序
/** * 二维数组根据key排序 * @param $arr * @param $arr_key * @param string $order 排序规则 * @return mixed */ fun ...
- vue+vant-ui小程序,微信小程序自定义导航栏(适配刘海屏)
整理一下微信小程序自定义导航栏和刘海屏适配问题 1.首先在根据官方文档,我们在小程序修改 app.json 中的 window 的属性 "navigationStyle": &qu ...
- [2] Bert 论文精读
BERT是NLP领域让预训练这件事情出圈的工作. 开篇Introduction介绍了两类主流的预训练方法: 1.feature-based,即基于特征的,即我首先通过预训练得到一些比较好的特征,然后将 ...
- uml类图中的+,-,#符号的含义
描述类的属性的可见性: UML中,可见性分为4级 1.public 公用的 :用+ 前缀表示 ,该属性对所有类可见 2.protected 受保护的:用 # 前缀表示,对该类的子孙可见 3.priva ...
- Java基础——IO设计模式总结
- repmgr部署和测试
https://www.modb.pro/db/22029 https://blog.csdn.net/qq_34479012/article/details/125706815?app_versio ...
- pytest学习总结
官方pytest文档:Full pytest documentation - pytest documentation 一.pytest以及辅助插件的安装 1.pytest安装 pip install ...
- a[i]之和小于N的含义
例题 小白月赛 困难卷积 题目 要求一个暴力算是 \(O(n^2)\) 的东西 同时题目保证 \(\sum a[i] \leq 10^7\) 题解 \(\sum a[i] \leq 10^7\) 的含 ...
- linux并行执行线程
资料来源: (1) https://www.jianshu.com/p/d8d58846c53f(作者:黄甫一) 1.并行任务较少时: (1) 给需要并行运行的命令行在结尾加上"&& ...