websocket-spring-boot-starter
readme
介绍
一个简单,快速,低配的spring-boot-starter,是对spring-boot-starter-websocket
的扩展与二次封装,简化了springboot应用对websocket的操作
特点
- 简单,低配
- 支持websocket连接可控,可以防止前端恶意连接,重复连接
- 支持单点发送,部分发送,所有发送
- 支持消息中转,集群环境跨机器传递消息(redis 做的消息中转,需要配置redis)
- 可监控实时连接数
安装教程
- 先把项目下载到本地
git clone git@github.com:Jack9610/websocket-spring-boot-starter.git
- 将项目install到本地
maven install
- 依赖进自己的项目
<dependency>
<groupId>com.jack</groupId>
<artifactId>websocket-spring-boot-starter</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
使用说明
- 实现
Identity
,这个接口是对当前使用websocket对象的抽象,建议使用当前系统登录的user,只需要返回一个唯一的IdentityId
即可
@Data
public class User implements Identity {
private String userId;
private String username;
private String password;
@Override
public String getIdentityId() {
// 可以自定义返回任何信息,确保每个客户端唯一即可
return userId;
}
}
- 实现
IdentityService
,这个接口提供返回Identity
的服务,这里返回的Identity
将作用于鉴定是否连接,接收消息的MessageHandler的入参
@Service
public class IdentityServiceImpl implements IdentityService {
@Resource
private UserService userService;
@Override
public Identity getIdentity(String s) {
String userId = JwtUtil.getUserId(s);
// 这里演示,从数据库直接读出user
return userService.get(userId);
}
}
- 发消息
public class BizService{
@Autowired
private WsTemplate wsTemplate;
public void test(){
// wsTemplate.sendMessageToAll(...);
// wsTemplate.sendMessageToPart(...);
// wsTemplate.sendMessageToSingle(...);
}
}
- 收消息
// TestParam 只是一个普通的JavaBean,自己定义的,前端在这个Scene下,必须传该javabean对应的json格式数据字符串
// 前端发送数据示例: {"scene":"test","data":{"name":"Jack","description":"一只菜鸟"}}
public class HalloMessageHandler implements MessageHandler<TestParam>{
// 处理前端发送的消息
@Override
public void handleMessage(TestParam testparam,Identity identity){
// do Something
}
// 定义一个场景
@Override
public String getScene(){
return "test";
}
}
测试html
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>菜鸟教程(runoob.com)</title>
</head>
<style>
.box{
border: 1px solid red;
width: 1000px;
height: 600px;
overflow-y: auto;
}
</style>
<body>
<div class="box">
</div>
<input type="text" id="input">
<button id="send">发消息</button>
<button id="end">结束</button>
</body>
<script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
<script type="text/javascript">
// 发送消息参数示例 : {"scene":"test","data":{"name":"Jack","description":"一只菜鸟"}}
// 连接参数 : ws://ip:port/ws?Authorization={{授权信息}}
var ws = new WebSocket("ws://127.0.0.1:8000/ws?Authorization=abc");
ws.onopen = function(){
// Web Socket 已连接上,使用 send() 方法发送数据
alert("连接成功...");
};
ws.onclose = function(e){
// 关闭 websocket
alert("连接已关闭..."+ e.status + " " + e.reason);
};
ws.onmessage = function (evt) {
var received_msg = evt.data;
$(".box").append('收到:' + received_msg + '<br>');
};
ws.onerror = function (evt) {
var received_msg = evt.data;
alert("error" + received_msg)
$(".box").append(received_msg + '<br>');
};
$('#send').click(function(){
$(".box").append($('#input').val() + '<br>');
ws.send($('#input').val());
$('#input').val('')
})
$('#end').click(function(){
ws.close()
})
self.setInterval("send()",10000);
function send() {
$(".box").append('发送:ping' + '<br>');
ws.send("ping")
}
</script>
</html>