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.语法结构 ...
随机推荐
- pve apt 更新
解决pve6.2/pve6.3 安装ifupdown2,失败问题 https://www.cnblogs.com/lovesKey/p/14400874.html https://blog.whsir ...
- 搭建 springboot 应用
一.采用 Spring Initializr 搭建springboot应用 步骤: 1.只需要打开网址: https://start.spring.io/: 2.选择使用 Maven 构建,语言 ja ...
- 嵌在Android app的html 拨打不了电话,发送不了短信
html嵌在app里面的 <a href="tel:xxx"></a> <a href="sms:phoneNmber?body=1111& ...
- vue 3 引入 scss
安装必要的依赖: 调用: 效果:
- 性能测试-性能分析思路以及CPU
1.性能分析思路 性能测试分析的思路:先分析硬件 .网络. 系统配置.应用程序 硬件: cpu.内存.磁盘.网络.io 4.常见问题处理4.1 常见问题及解决方法如果r经常大于4,且id经常少于40, ...
- 夸克开发板 FaceDetectOnTft.py 测试
① 连接usb 摄像头,执行 dmesg | grep -i video 查看设备识别情况 同时可看到 frame buffer 显示设备(自带的 tft LCD)名称 ② 摄像头识别的设备名为, / ...
- 现代 C++ 教程 高速上手 C++ 11/14/17/20
国人作品,主要介绍C++11/14/17的新特性,适合新手阅读
- 使用Github或Gitlab的Webhooks实现代码自动更新部署(Ubuntu20.04)
1.安装ssh服务root@Ubuntu:~# apt-get install openssh-server 2.部署phproot@Ubuntu:~# add-apt-repository ppa: ...
- Zookeeper ZAB协议
这篇博客是从源码的角度了解Zookeeper 从接收客户端请求开始,到返回数据为止,有很多涉及到的对象创建因为在前几篇文章已经说明过了,这里就不再重复的说明了,如果不是很明白的的,可以先看前几篇博文了 ...
- 浅谈JS输出中的“+”作用问题
背景(问题) web前端考试有这么一道题目(为了阅读方便和应文章的景,小编将题目进行了微调) <input type="number" value="1" ...