美文网首页
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小记

    ws又是一个每次用的时候都要搞懂一堆概念,然后下次又忘了的东西,所以打算写下来。。。 通讯有七层模型,下面的一层都...

  • websocket小记

    websocket可以实现消息的实时推送,应用较为广泛,在工作中可以结合大数据数据的推送,后台接收并推送到前端展示...

  • WebSocket

    WebSocket Introduction WebSocket general:阮一峰的WebSocket 教程...

  • 2020-04-03

    ## webSocket初探 ## 目录 - 为什么WebSocket - 什么是WebSocket - WebS...

  • WebSocket

    WebSocket(1)---WebSocket介绍 一、为什么需要 WebSocket?初次接触 WebSock...

  • Spring和WebSocket整合详解

    Spring和WebSocket整合详解 官方主页 Spring WebSocket 概述 WebSocket 是...

  • WebSocket 的对象特性

    WebSocket对象特性 1readyState:WebSocket只读属性,表示WebSocket的连接状态。...

  • WebSocket 笔记

    WebSocket 笔记 WebSocket 握手客户端请求 Sec-WebSocket-Key: dGhlIHN...

  • WebSocket 概述和方案选型

    WebSocket测试工具:http://www.websocket-test.com/ Websocket是ht...

  • spring boot 集成 websocket 的四种方式

    【websocket】spring boot 集成 websocket 的四种方式 集成 websocket 的四...

网友评论

      本文标题:websocket小记

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