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.语法结构 ...
随机推荐
- C 数值类型与字节数组相互转化
C 数据类型与字节数组相互转化 uint16_t -> bytes uint8_t uint16_t2bytes(uint8_t* buffer, uint16_t data) { if(buf ...
- 成都信息工程大学第八届校赛 H J 题解
H. Bang Bang Keli Ba 题目大意 给定数组 \(a\) ,构造递增序列 \(b\) 和递减序列 \(c\) 且 \(a_i=b_i+c_i\) . 题解 下面证明解的存在性,存在性证 ...
- docker 搭建minio
minio为开源的高可用分部署对象存储服务组件,已经提供了分布式部署的解决方案,实现高可靠.高可用的资源存储,MinIO以极简主义为指导进行设计,追求极致的维护精简性和卓越的读写性能表现. -dock ...
- styled-components 全局样式定义,由injectGlobal改为createGlobalStyle
The injectGlobal API was removed and replaced by createGlobalStyle in styled-components v4. 原文链接 官方链 ...
- Neural Network模型复杂度之Residual Block - Python实现
背景介绍 Neural Network之模型复杂度主要取决于优化参数个数与参数变化范围. 优化参数个数可手动调节, 参数变化范围可通过正则化技术加以限制. 本文从优化参数个数出发, 以Residual ...
- 消息队列RocketMQ应用
引用: https://www.cnblogs.com/ciel717/p/16180083.html 官方手册:https://help.aliyun.com/document_detail/442 ...
- 内存模型--共享、JMM
Balking 指令重排
- Java调试排错心得
首先这里没有报错,但是打印了四行相同的数据,还都是最后一行的数据.然后调试了一下 这里是重点: 下面哪里account = {Account@1580}是一直用的一个对象,所有每一次调试那些什么rs. ...
- [转]如何将本地项目上传至Gitee仓库(详细教程)
码云(Gitee)简单介绍 Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目. Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放 ...
- windows下C#读文件遇到一个路径的天坑
在win下面准备了一个文件,右键属性然后"安全"复制完整的文件路径, 放到C#代码(vs中编写)中来读取,竟然死活异常: System.IO.IOException HResult ...