WebSocket是一种在单个TCP连接上进行全双工通信的协议。WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。
1.新建config包,创建WebSocketConfig类
@Configuration public class WSConfiguration { @Bean public ServerEndpointExporter serverEndpointExporter(){ return new ServerEndpointExporter(); } }
2.新建service包,创建WebSocketServer类
@Component @ServerEndpoint("/websocket") public class WebSocketServer { //准备一个内部安全的集合 存放所有用户的websocket服务 private static CopyOnWriteArraySetwsset = new CopyOnWriteArraySet<>(); private Session session; @OnOpen public void opOpen(Session session){ this.session=session; //将自身填充到set集合中 这个集合是所有客户端websocket的集合 wsset.add(this); sendMsg(); } @OnClose public void onClose(){ //将自己从set集合中删除 wsset.remove(this); } @OnError public void onError(Session session,Throwable error){ System.out.println(this+"发生错误了"); } //客户端发来消息 @OnMessage public void onMessage(String clientMsg, Session session){ System.out.println("来自客户端的信息+“。。。。。。。。。”===》"+clientMsg); //每隔一秒给你推送一条当前时间信息 } private void sendMsg(){ try { while(true){ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String time =sdf.format(new Date()); //发送数据 this.session.getBasicRemote().sendText(time); Thread.sleep(1000); } } catch (IOException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } } }
3.controller层加注解
@SpringBootApplication @EnableWebSocket public class MywebsocketApplication { public static void main(String[] args) { SpringApplication.run(MywebsocketApplication.class, args); } }
4在resources下编写HTMl
5网页访问
http://localhost:8080/
6 WebSocketServer同步发送消息
package com.kgc.mywebsocket.commons; import org.springframework.stereotype.Component; import org.springframework.stereotype.Service; import javax.websocket.*; import javax.websocket.server.ServerEndpoint; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.CopyOnWriteArraySet; @Component @ServerEndpoint("/websocket") public class WebSocketServer { //准备一个内部安全的集合 存放所有用户的websocket服务 private static CopyOnWriteArraySetwsset = new CopyOnWriteArraySet<>(); private Session session; @OnOpen public void opOpen(Session session){ this.session=session; //将自身填充到set集合中 这个集合是所有客户端websocket的集合 wsset.add(this); // sendMsg(); } @OnClose public void onClose(){ //将自己从set集合中删除 wsset.remove(this); } @OnError public void onError(Session session,Throwable error){ System.out.println(this+"发生错误了"); } //客户端发来消息 @OnMessage public void onMessage(String clientMsg, Session session){ System.out.println("来自客户端的信息+“。。。。。。。。。”===》"+clientMsg); //每隔一秒给你推送一条当前时间信息 sendAllClient(clientMsg); } private void sendMsg(){ try { while(true){ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String time =sdf.format(new Date()); //发送数据 this.session.getBasicRemote().sendText(time); Thread.sleep(1000); } } catch (IOException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } } private void sendAllClient(String msg){ try { for(WebSocketServer wss:wsset){ wss.session.getBasicRemote().sendText(msg); } } catch (IOException e) { e.printStackTrace(); } } }
7 html同步发送消息
========== ==========
http://localhost:8080/