9、springboot和websocket的集成,实现简单的单发和群发消息

新建简单的springboot项目,引入socket相关的jar包

org.springframework.bootspring-boot-starter-thymeleaf

org.springframework.bootspring-boot-starter-web

org.springframework.bootspring-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)

     


    本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

    相关文章

    立即
    投稿

    微信公众账号

    微信扫一扫加关注

    返回
    顶部