websocket实战

Posted guxiaohai_

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了websocket实战相关的知识,希望对你有一定的参考价值。

一:简介

  1. WebSocket协议通过在客户端和服务端之间提供全双工通信来进行Web和服务器的交互功能。
    在WebSocket应用程序中,服务器发布WebSocket端点,客户端使用url连接到服务器。建立连接后,服务器和客户端就可以互相发送消息。客户端通常连接到一台服务器,服务器接受多个客户端的连接。

二:实战

  1. 服务器代码

    @Slf4j
    @Component
    @ServerEndpoint(value = "/websocket")
    public class WebSocketController {
    
        //静态变量,用来记录当前在线连接数。应该把它设置成线程安全的。
        private static int onlineCount = 0;
    
        //concurrent包的线程安全set,用来存放每个客户端对应的MyWebSocket对象。
        private static CopyOnWriteArrayList<WebSocketController> webSocketServers = new CopyOnWriteArrayList<>();
    
        //与某个客户端连接对话,需要通过它来向客户端发送数据
        private Session session;
    
        /**
         * 初始化注入
         */
        private static WebSocketController webSocketController;
        @PostConstruct
        public void init(){
            webSocketController = this;
        }
    
        /**
         * @Author: guwenhai
         * @Description:    连接建立成功调用方法
         * @Date: 2020/12/1 9:56
         */
        @OnOpen
        public void OnOpen(Session session){
            this.session = session;
            webSocketServers.add(this); //加入set中
            addOnlineCount();   //在线数+1
            log.info("有新连接加入!当前在线人数为:{}",getOnlineCount());
            try {
                dataInformation("1");
            } catch (Exception e){
                log.error("WebSocket IO异常");
                e.printStackTrace();
            }
        }
    
        /**
         * @Author: guwenhai
         * @Description:    连接关闭调用方法
         * @Date: 2020/12/1 10:00
         */
        @OnClose
        public void OnClose(){
            webSocketServers.remove(this);  //从set中删除
            subOnlineCount();   //在线人数-1
            log.info("有一个连接关闭!当前人数为:{}",getOnlineCount());
        }
    
        /**
         * @Author: guwenhai
         * @Description:    收到客户端消息后调用的方法
         * @Date: 2020/12/1 10:01
         */
        @OnMessage
        public void OnMessage(String message,Session session){
            log.info("来自客户端消息:{}",message);
            //群发消息
            for (WebSocketController item : webSocketServers) {
                try {
                    item.sendMessage(message);
                } catch (IOException e){
                    log.error("群发消息异常");
                    e.printStackTrace();
                }
            }
        }
    
        /**
         * @Author: guwenhai
         * @Description:    错误
         * @Date: 2020/12/1 10:02
         */
        @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 void sendMessage(Object obj) throws IOException,EncodeException{
            this.session.getBasicRemote().sendObject(obj);
        }
    
        public static synchronized int getOnlineCount(){
            return onlineCount;
        }
    
        public static synchronized void addOnlineCount(){
            WebSocketController.onlineCount ++ ;
        }
    
        public static synchronized void subOnlineCount(){
            WebSocketController.onlineCount -- ;
        }
    
        /**
         * @Author: guwenhai
         * @Description:    自定义推送消息
         * @param type  类型:1-第一次连接推送消息,2-定时推送消息
         * @Date: 2020/12/1 10:09
         */
        public void dataInformation(String type){
            log.info("进入自定义推送消息");
            if(type.equals("1")){
                try {
                    StringWriter writer = new StringWriter();
                    ObjectMapper mapper = new ObjectMapper();
                    mapper.writeValue(writer,"数据消息---");
                    String message = writer.toString();
                    sendMessage(message);
                } catch (Exception e){
                    log.error("第一次握手---自定义推送消息异常");
                    e.printStackTrace();
                }
            } else if(type.equals("2")){
                for (WebSocketController item : webSocketServers) {
                    try {
                        StringWriter writer = new StringWriter();
                        ObjectMapper mapper = new ObjectMapper();
                        mapper.writeValue(writer,"数据消息---");
                        String message = writer.toString();
                        item.sendMessage(message);
                    } catch (IOException e){
                        log.error("自动推送---自定义推送消息异常");
                        e.printStackTrace();
                    }
                }
            }
        }
    }
    
  2. 客户端代码

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8">
        <title>测试webSocket</title>
        <script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
        <script type="text/javascript">
            function WebSocketTest(){
                if ("WebSocket" in window){
                    console.log("您的浏览器支持 WebSocket!")
                    // 打开一个 web socket
                    var ws = new WebSocket("ws://localhost:7001/websocket");
                    ws.onopen = function(){
                        // Web Socket 已连接上,使用 send() 方法发送数据
                        // ws.send("1");
                        console.log("数据发送中...")
                    };
                    ws.onmessage = function (evt){
                        var received_msg = evt.data;
                        console.log("数据已接收..." + received_msg)
                    };
                    ws.onclose = function(){
                        // 关闭 websocket
                        console.log("连接已关闭...")
                    };
                } else {
                    // 浏览器不支持 WebSocket
                    console.log("您的浏览器不支持 WebSocket!")
                }
            }
        </script>
    </head>
    <body>
    <div id="sse">
        <a href="javascript:WebSocketTest()">运行 WebSocket</a>
    </div>
    </body>
    </html>
    

以上是关于websocket实战的主要内容,如果未能解决你的问题,请参考以下文章

看完让你彻底理解 WebSocket 原理,附完整的实战代码(包含前端和后端)

websocket实战

WebSocket 实战

详解 WebSocket 原理,附完整的聊天室实战 Demo

solr分布式索引实战分片配置读取:工具类configUtil.java,读取配置代码片段,配置实例

Watson语音到文本 - 无法构造'WebSocket':URL包含片段标识符