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.语法结构 ...
随机推荐
- 【SSO单点系列】(3):CAS4.0 之自定义返回登出页面
一.登出实现返回自定义页面 服务端修改 cas-servlet.xml <bean id="logoutAction" class="org.jasig.cas.w ...
- 腾讯云静态资源放到cos存储桶里,并开启CDN自定义域名加速
首先根据腾讯云cos对应文档创建cos存储桶(权限为共有读私有写),上传build之后的静态文件到存储桶根目录,然后配置静态网站,然后访问静态网站的访问节点,如果报错请配置索引文档和错误文档为inde ...
- [人脸识别]01-python环境准备-安装opencv
安装opencv pip install opencv-python pip install matplotlib pip install opencv-contrib-python --user
- Jmeter学习:插件
第三方插件官方下载网址:https://jmeter-plugins.org/install/Install/ 第三方插件官方文档网址:https://jmeter-plugins.org/wiki/ ...
- 谷歌云|机密 GKE 节点可在计算优化的 C2D 虚拟机上使用
机密 GKE 节点可用于计算优化的 C2D 虚拟机. 许多公司已采用 Google Kubernetes Engine (GKE) 作为其应用程序基础架构中的关键组件.在某些情况下,使用容器和 Kub ...
- 实验1task3
<实验结论> #include <stdio.h> #include <stdlib.h> int main() { int a, b, t; a = 3; b = ...
- facade是如何产生的 in laravel
据说Facade是为了简化写法, 好记,也有人说要废除这个特性, 据说这个特性有很好的的testability 测试性, 我不清楚, 这个是怎么说出来的理由是什么? 很多Facade 是系统写好的, ...
- 强烈推荐的elasticsearch集群连接工具: elasticvue
个人感觉非常棒的es-cluster连接工具, 检查状态什么的, 一目了然, 支持中文超方便, 比elasticSearchHead好用多了. 安装方法打开微软浏览器edge-商城搜索-Elastic ...
- 自考网络原理:安全套接字层SSL
对ssl/tls的理解 前:SSL; 后:TLS: 以下是B站上的up主讲的,非常的深入浅出,讲的很好.感谢技术蛋老师. https://www.bilibili.com/video/BV1KY411 ...
- https原理(六)系统分析
先解决此前的问题: 1 http原理(三)双向实践(curl) need时java 客户端可访问,但没客户端证书:want时有 后来发现,没有给truststore,猜测为,当springboot读到 ...