美文网首页
websocket小记

websocket小记

作者: CrazyCat_007 | 来源:发表于2019-02-01 10:43 被阅读0次

    websocket可以实现消息的实时推送,应用较为广泛,在工作中可以结合大数据数据的推送,后台接收并推送到前端展示,下面是我做的一个简单测试。

    首先在pom.xml文件的<dependencies></dependencies>中引入依赖:

    <dependency>

        <groupId>org.springframework.boot</groupId>

        <artifactId>spring-boot-starter-websocket

    </dependency>

    创建TestWebSocketServer类:

    @ServerEndpoint(value = "/websocket/test", configurator = HttpSessionConfigurator.class)

    @Component

    public class TestWebSocketServer extends TextWebSocketHandler {

    private static final Loggerlogger = LoggerFactory.getLogger(TestWebSocketServer.class);

        /**

    * concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。

    */

        private static CopyOnWriteArraySet<TestWebSocketServer> webSocketSet = new CopyOnWriteArraySet<>();

        /**

    * 与客户端的连接会话,通过该对象给客户端发送数据

    */

        private Session session;

        /**

    * 连接建立成功调用的方法

    */

        @OnOpen

        public void onOpen(Session session, EndpointConfig config){

            this.session = session;

            webSocketSet.add(this);    //加入set中

            logger.info("有新窗口开始监听");

            try {

                sendMessage("连接成功");

            }catch (IOException e) {

                logger.error("websocket IO异常");

            }

    }

    /**

    * 连接关闭调用的方法

    */

        @OnClose

        public void onClose() {

            // 从set中删除

            webSocketSet.remove(this);

            logger.info("连接关闭");

        }

    /**

    * 收到客户端消息后调用的方法

    *

        * @param message 客户端发送过来的消息

    */

        @OnMessage

        public void onMessage(String message, Session session) {

            logger.info("收到来自客户端的信息:"+message);

            //群发消息

            for (TestWebSocketServer item :webSocketSet) {

                try {

                    item.sendMessage(session.getId()+":"+message);

                }catch (IOException e) {

                    e.printStackTrace();

                }

        }

    }

    /**

    * 发生错误时调用

        * @param session

        * @param error

        */

        @OnError

        public void onError(Session session, Throwable error) {

            logger.error("发生错误");

            error.printStackTrace();

        }

    /**

    * 向客户端发送数据

    *

        * @param message 数据

        * @throws IOException 异常

    */

        public void sendMessage(String message)throws IOException {

            logger.info("消息:{}",message);

            this.session.getBasicRemote().sendText(message);

        }

    /**

    * 群发自定义消息

        * @param message

        * @throws IOException

    */

        public void sendInfo(String message)throws IOException {

                logger.info(message);

                for (TestWebSocketServer item :webSocketSet) {

                    try {

                        item.sendMessage("AI:"+message);

                    }catch (IOException e) {

                        continue;

                    }

            }

        }

    }

    Controller类中调用TestWebSocketServer

    @Autowired

    private TestWebSocketServer testWebSockeServer;

    接收数据并推送:

    @RequestMapping(value ="/test/infos",method = RequestMethod.POST)

    public ResponseResult sendMessage(@Valid @RequestBody final TestWebsocketPojo[] testWebsocketPojos){

    ResponseResult result =new ResponseResult();

        try{

                if(testWebsocketPojos==null || testWebsocketPojos.length==0){

                result.setErrMsg("参数为空");

                result.setSuccess(false);

                return result;

            }

        for(TestWebsocketPojo pojo: testWebsocketPojos){

                testWebSockeServer.sendInfo("hello,开始我们的测试");

                testWebSockeServer.sendInfo(pojo.toString());

            }

            result.setErrMsg("传输数据成功");

            result.setSuccess(true);

        }catch(Exception e){

            result.setErrMsg("服务出现异常"+e.getMessage());

            result.setSuccess(false);

        }

            return result;

    }

    测试页面及js调用:

    <!DOCTYPE html>

    <html lang="en">

        <meta charset="UTF-8">

        <title>testWebsocket

        // 初始化一个 WebSocket 对象

        var ws =new WebSocket("ws://localhost:8002/websocket/test");

        // 建立 web socket 连接成功触发事件

        ws.onopen =function () {

            // 使用 send() 方法发送数据

            console.log("Socket 已打开");

            ws.send("发送数据");

            alert("数据发送中...");

        };

            // 接收服务端数据时触发事件

            ws.onmessage =function (evt) {

            console.log(evt.data);

            var received_msg = evt.data;

            alert("数据已接收...");

        };

            // 断开 web socket 连接成功触发事件

            ws.onclose =function () {

            console.log("Socket已关闭");

            alert("连接已关闭...");

        };

        测试websocket<a href="/index.html">跳转

    </html>

    相关文章

      网友评论

          本文标题:websocket小记

          本文链接:https://www.haomeiwen.com/subject/wiirsqtx.html