SpringBoot集成Socket
什么是Socket
在计算机通信领域,socket 被翻译为“套接字”,它是计算机之间进⾏通信的⼀种约定或⼀种⽅式。通过 socket 这种约定,⼀台计算机可以接收其他计算机的数据,也可以向其他计算机发送数据
Socket起源
socket起源于Unix,⽽Unix/Linux基本哲学之⼀就是“⼀切皆⽂件”,都可以⽤“打开open –> 读写write/read –> 关闭close”模式来操作。
Socket的主要作⽤
主要是⽤来解决⽹络通信的
本篇重点
Socket先了解这么多,更深的内容可以⾃⾏补充。本篇⽂章主要想实现 平台在线⼈数实时统计的功能
前后端
后端:SpringBoot+Socket
前端:Vue
具体步骤
引⼊依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
socket配置
@Configuration
public class WebSocketConfig {
@Bean
public ServerEndpointExporter serverEndpointExporter(){
return new ServerEndpointExporter();
}
}
WebSocketServer端
**
*由于是websocket 所以原本是@RestController的http形式
*直接替换成@ServerEndpoint即可,作⽤是⼀样的就是指定⼀个地址
*表⽰定义⼀个websocket的Server端
*/
@Component
@ServerEndpoint("/websocket/{userId}")
public class MySocket {
private Session session;
private static CopyOnWriteArraySet<MySocket> webSockets =new CopyOnWriteArraySet<>(); private static Map<String, Session> sessionPool =new HashMap<String, Session>();
/**
* 有新的连接加⼊
**/
@OnOpen
public void onOpen(Session session,@PathParam(value ="userId") String userId){
this.session = session;
webSockets.add(this);
sessionPool.put(shopId, session);
// 新的连接加⼊通知客户端
sendMessageToAll(webSockets.size()+"");
System.out.println("【websocket消息】有新的连接,总数为:"+ webSockets.size());
}
/**
* websocket消息连接断开
**/
@OnClose
public void onClose(){
// 断开连接通知客户端
sendMessageToAll(webSockets.size()+"");
System.out.println("【websocket消息】连接断开,总数为:"+ webSockets.size());
}
/**
* websocket消息收到客户端消息
**/
@OnMessage
public void onMessage(String message){
System.out.println("websocket消息收到客户端消息:"+ message);
}
/**
* 通知所有的客户端
*
* @param message
*/
public void sendMessageToAll(String message){
for(MySocket webSocket : webSockets){
System.out.println("【websocket】通知所有的客户端:"+ message);
try{
AsyncRemote().sendText(message);
}catch(Exception e){
e.printStackTrace();
}
}
}
}
Vue代码
export default{
created(){
// 页⾯创建⽣命周期函数
this.initWebSocket()
},
destroyed: function (){
// 页⾯销毁⽣命周期函数
this.websocketclose();
},
methods:{
initWebSocket: function (){
// WebSocket与普通的请求所⽤协议有所不同,ws等同于http,wss等同于https
this.websock = new WebSocket("ws://localhost:8080/websocket/userId");
pen = this.websocketonopen;
r = this.websocketonerror;
ssage = this.websocketonmessage;
lose = this.websocketclose;
},
websocketonopen: function (){
console.log("WebSocket连接成功...");
},
websocketonerror: function (e){
console.log("WebSocket连接发⽣错误...");
},
spring boot是啥websocketonmessage: function (e){
console.log(e.data);
if (e.data !== undefined){
}
},
websocketclose: function (e){
console.log("connection closed (" + e.code + ")");
}
}
设置
@Override
protected void configure(HttpSecurity http)throws Exception {
http.addFilterBefore(jwtAuthenticationTokenFilter, UsernamePasswordAuthenticationFilter.class) .authorizeRequests()
.antMatchers("/websocket/**"").permitAll()
.anyRequest().authenticated()
.and().sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS); }
测试-项⽬启动后台
测试-启动前台-效果
测试-查看后台⽇志打印及界⾯
测试-打开第⼆个浏览器后查看后台⽇志打印
测试-关闭⼀个浏览器后查看
⼩结
本篇主要以⼀个⼩case介绍了socket的⽤法,希望能对初接触
的⼩伙伴有些借鉴。要彻底搞懂Socket还要进⼀步深⼊
最近听到⼀句话,很有感触,送给⼤家 “基础不牢,地动⼭摇”!⼩伙伴们⼀起加油!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论