在手机上坚信都是有来源于网络服务器的消息推送信息,例如一些立即的新闻报道,本文关键便是完成这一作用,只演试一个基本上的实例。应用的是websocket技术性。
tWebSocket协议书是根据TCP的一种新的网络层协议。它完成了手机客户端与网络服务器双工通讯,学过计算机网都了解,即然是双工,就表明了网络服务器能够积极发送短信给手机客户端。这与大家的消息推送技术性或是是多的人即时聊天的作用如出一辙。
为什么不应用HTTP 协议书呢?这是由于HTTP是单工通讯,通讯只有由手机客户端进行,手机客户端要求一下,网络服务器解决一下,这就太麻烦了。因此websocket应时而生。
下边大家就立即逐渐应用Springboot逐渐融合。下列实例都是在自己的电脑检测取得成功,你能依据自身的作用开展改动就可以。
Idea 2018标准版(已破解)
Maven 4.0.0
SpringBoot 2.2.2
websocket 2.1.3
jdk 1.8
下边大家新创建一个一般的Springboot新项目。
- <dependencies>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-web</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-test</artifactId>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-websocket</artifactId>
- <version>2.1.3.RELEASE</version>
- </dependency>
- </dependencies>
一句话:server.port=8081
- 1@Configuration
- 2public class WebSocketConfig {
- 3 @Bean
- 4 public ServerEndpointExporter serverEndpointExporter() {
- 5 return new ServerEndpointExporter();
- 6 }
- 7}
- @ServerEndpoint("/websocket/{sid}")
- @Component
- public class WebSocketServer {
- static Log log= LogFactory.getLog(WebSocketServer.class);
- //静态变量,用于纪录当今在线线程数。应当把它设计方案成线程安全的。
- private static int onlineCount = 0;
- //concurrent包的线程安全Set,用于储放每一个手机客户端相匹配的MyWebSocket目标。
- private static CopyOnWriteArraySet<WebSocketServer> webSocketSet
- = new CopyOnWriteArraySet<WebSocketServer>();
- //与某一手机客户端的联接对话,必须根据它来给手机客户端传送数据
- private Session session;
- //接受sid
- private String sid="";
- /**
- * 联接创建取得成功启用的方式
- */
- @OnOpen
- public void onOpen(Session session,@PathParam("sid") String sid) {
- this.session = session;
- webSocketSet.add(this); //添加set中
- addOnlineCount(); //线上数加1
- log.info("有新页面逐渐监视:" sid ",当前在线总数为" getOnlineCount());
- this.sid=sid;
- try {
- sendMessage("联接取得成功");
- } catch (IOException e) {
- log.error("websocket IO出现异常");
- }
- }
- /**
- * 联接关掉启用的方式
- */
- @OnClose
- public void onClose() {
- webSocketSet.remove(this); //从set中删掉
- subOnlineCount(); //线上数减1
- log.info("有一联接关掉!当前在线总数为" getOnlineCount());
- }
- /**
- * 接到手机客户端信息后启用的方式
- * @param message 手机客户端推送回来的信息
- */
- @OnMessage
- public void onMessage(String message, Session session) {
- log.info("接到来源于对话框" sid "的信息内容:" message);
- //消息群发
- for (WebSocketServer item : webSocketSet) {
- try {
- item.sendMessage(message);
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- @OnError
- public void onError(Session session, Throwable error) {
- log.error("产生不正确");
- error.printStackTrace();
- }
- //完成网络服务器积极消息推送
- public void sendMessage(String message) throws IOException {
- this.session.getBasicRemote().sendText(message);
- }
- //群发消息自定信息
- public static void sendInfo(String message,@PathParam("sid") String sid)
- throws IOException {
- log.info("消息推送信息到对话框" sid ",消息推送內容:" message);
- for (WebSocketServer item : webSocketSet) {
- try {
- //这儿能够设置只消息推送给这一sid的,为null则所有消息推送
- if(sid==null) {
- item.sendMessage(message);
- }else if(item.sid.equals(sid)){
- item.sendMessage(message);
- }
- } catch (IOException e) {
- continue;
- }
- }
- }
- public static synchronized int getOnlineCount() {
- return onlineCount;
- }
- public static synchronized void addOnlineCount() {
- WebSocketServer.onlineCount ;
- }
- public static synchronized void subOnlineCount() {
- WebSocketServer.onlineCount--;
- }
- @Controller
- public class MyController {
- //网页页面要求
- @GetMapping("/socket/{cid}")
- public ModelAndView socket(@PathVariable String cid) {
- ModelAndView mav=new ModelAndView("/socket");
- mav.addObject("cid", cid);
- return mav;
- }
- //消息推送api接口
- @ResponseBody
- @RequestMapping("/socket/push/{cid}")
- public String pushToWeb(@PathVariable String cid,String message) {
- try {
- WebSocketServer.sendInfo(message,cid);
- } catch (IOException e) {
- e.printStackTrace();
- return "消息推送不成功";
- }
- return "发送成功";
- }
- }}
- <html>
- <head>
- <meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
- <script type="text/javascript">
- var socket;
- if (typeof (WebSocket) == "undefined") {
- console.log("您的电脑浏览器不兼容WebSocket");
- } else {
- console.log("您的电脑浏览器适用WebSocket");
- //完成化WebSocket目标,特定要联接的服务器ip与端口号 创建联接
- socket = new WebSocket("ws://localhost:8081/websocket/1");
- //开启事情
- socket.onopen = function () {
- console.log("Socket 已开启");
- socket.send("它是来源于手机客户端的信息" location.href new Date());
- };
- //得到 信息事情
- socket.onmessage = function (msg) {
- console.log(msg.data);
- };
- //关掉事情
- socket.onclose = function () {
- console.log("Socket已关掉");
- };
- //发生了不正确事情
- socket.onerror = function () {
- alert("Socket发生了不正确");
- }
- }
- </script>
- </head>
- </html>
如今开发设计网络服务器和网页页面就可以见到实际效果了。一般状况下Springboot2 Netty Websocket的组成方法更为的常见一下。这一仅仅得出了一个基本上的实例,你能依据自身的要求开展变更。
文中转载微信公众平台「愚公要移山」,能够根据下列二维码关心。转截文中请联络愚公要移山微信公众号。