9、springboot和websocket的集成,实现简单的单发和群发消息
新建简单的springboot项目,引入socket相关的jar包
org.springframework.boot spring-boot-starter-thymeleaf
org.springframework.boot spring-boot-starter-web
org.springframework.boot spring-boot-starter-websocket
在resources/templates/ws.html文件
注:(关闭掉这个页面之后,socket连接就会关闭)
//前后端分离的使用域名的时候,记得nginx把端口打开,因为springboot项目和websocket使用不同的端口,如果nginx没有打开websocket端口监听,前端是链接不上的
socket = new WebSocket("ws://localhost:8080/ws/asset");
websocket测试
WebSocket测试
单发消息
url=http://localhost:8080/test/sendOne?message=单发消息内容&id=none 群发消息url=http://localhost:8080/test/sendAll?message=群发消息内容
真实页面,启动项目之后访问:http://localhost:8080/ws

webmvc的视图控制器配置
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {@Overridepublic void addViewControllers(ViewControllerRegistry registry) {registry.addViewController("/ws").setViewName("/ws");}
}
websocket的ServerEndpointExporter
@Configuration
public class WebSocketConfig {@Beanpublic ServerEndpointExporter serverEndpointExporter() {return new ServerEndpointExporter();}
}
群发和单发消息调用的接口:
@RestController
@RequestMapping("/test")
@EnableScheduling
public class WsController {/*** 群发消息接口* @param message* @return*/@GetMapping("/sendAll")public String sendAll(@RequestParam String message){WebSocketServer.broadCastInfo(message);return "ok";}/*** 服务器定时群发消息* @return*/@Scheduled(cron = "0/5 * * * * ? ")public String sendAll(){WebSocketServer.broadCastInfo("浏览器收到消息:服务端定时群发消息");return "ok";}/*** 单发消息接口* @param message 消息* @param id sessionId* @return*/@GetMapping("/sendOne")public String sendOne(@RequestParam String message,@RequestParam String id){WebSocketServer.SendMessage(id,message);return "ok";}
}
消息发送的方法
@ServerEndpoint("/ws/asset")
@Component
public class WebSocketServer {private static Logger log = LoggerFactory.getLogger(WebSocketServer.class);public static final AtomicInteger ONLINE_COUNT = new AtomicInteger(0);/*** 存放每个客户端对应的session对象*/private static CopyOnWriteArraySet SessionSet = new CopyOnWriteArraySet<>();@OnOpenpublic void onOpen(Session session){SessionSet.add(session);int count = ONLINE_COUNT.incrementAndGet();log.info("有新的连接加入:{},当前连接数为:{}",session.getId(),count);}@OnClosepublic void OnClose(Session session){SessionSet.remove(session);int count = ONLINE_COUNT.decrementAndGet();log.info("有连接关闭:{},当前连接数为:{}",session.getId(),count);}@OnMessagepublic void OnMessage(String message,Session session){log.info("收到客户端消息:{}",message);sendMessage(session,"浏览器收到消息:"+message);}@OnErrorpublic void OnError(Session session,Throwable error){log.error("发生错误:{},Session ID: {}",error.getMessage(),session.getId());error.printStackTrace();}public static void sendMessage(Session session,String message){try {session.getBasicRemote().sendText(String.format("%s (From Server,Session ID=%s)",message,session.getId()));} catch (IOException e) {e.printStackTrace();} finally {}}public static void broadCastInfo(String message) {for (Session session : SessionSet) {if(session.isOpen()){sendMessage(session,message);}}}public static void SendMessage(String id, String message) {Session session = null;//先通过id找到sessionfor (Session s : SessionSet) {if(s.getId().equals(id)){session = s;break;}}if(session != null){sendMessage(session,message);}else{log.error("未找到指定的sessionId");}}
}
springboot启动类
@SpringBootApplication
public class TestApplication {public static void main(String[] args) {SpringApplication.run(TestApplication.class, args);}}
启动服务
访问http://localhost:8080/ws,多开几个页面访问http://localhost:8080/ws,每开一个页面,都能收到服务器定时群发消息

通过调用接口,让服务器群发和单发消息
群发:http://localhost:8080/test/sendAll?message=123
单发:http://localhost:8080/test/sendOne?message=单发消息内容&id=1(这里的id是session Id)
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
