首页 > 其他分享 >WebSocket

WebSocket

时间:2023-08-05 13:55:28浏览次数:37  
标签:WebSocket socket token session message public String

1.使用

  • 前端js
function createScoket(token){
    var socket;
    if(typeof(WebSocket) == "undefined") {
        console.log("您的浏览器不支持WebSocket");
    }else{
        var host = window.location.origin.replace("http:","ws:")
        //实现化WebSocket对象,指定要连接的服务器地址与端口  建立连接
        socket = new WebSocket(host+":9000/ws/"+token);
        //打开事件
        socket.onopen = function() {
            console.log("Socket 已打开");
            socket.send("这是来自客户端的消息" + location.href + new Date());
        };

        //获得消息事件
        socket.onmessage = function(result) {
            console.log(result)
            var data = $.parseJSON(result.data);
        };
        //关闭事件
        socket.onclose = function() {
            console.log("Socket已关闭");
        };
        //发生了错误事件
        socket.onerror = function() {
            console.log("Socket发生了错误");
        }
        //窗口关闭
        $(window).unload(function(event){
            socket.close();
        });
    }
    return socket;
}

var socket = createScoket(token); 
  • pom.xml
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
  • WSServer
@ServerEndpoint("/ws/{token}")
@Component
public class OrderWSServer {
    public static ConcurrentHashMap<String,Session> clients = new ConcurrentHashMap<>();

    @OnOpen
    public void onOpen(Session session, @PathParam("token") String token){
        System.out.println("浏览器和服务器建立连接:"+token);
        //建立和浏览器的会话的映射关系
        clients.put(token,session);
    }

    /**
     * 收到客户端消息后调用的方法
     *
     * @param message
     */
    @OnMessage
    public void onMessage(String message) {
        System.out.println("【websocket消息】收到客户端消息:"+message);
    }

    @OnClose
    public void onClose(@PathParam("token") String token){
        System.out.println("浏览器和服务器断开连接:"+token);
        clients.remove(token);
    }

    @OnError
    public void one rror(Throwable error) {
        error.printStackTrace();
    }

//    // 此为广播消息
//    public void sendAllMessage(String message) {
//        log.info("【websocket消息】广播消息:"+message);
//        for(WebSocket webSocket : webSockets) {
//            try {
//                if(webSocket.session.isOpen()) {
//                    webSocket.session.getAsyncRemote().sendText(message);
//                }
//            } catch (Exception e) {
//                e.printStackTrace();
//            }
//        }
//    }
//
//    // 此为单点消息
//    public void sendOneMessage(String userId, String message) {
//        Session session = sessionPool.get(userId);
//        if (session != null&&session.isOpen()) {
//            try {
//                log.info("【websocket消息】 单点消息:"+message);
//                session.getAsyncRemote().sendText(message);
//            } catch (Exception e) {
//                e.printStackTrace();
//            }
//        }
//    }
//
//    // 此为单点消息(多人)
//    public void sendMoreMessage(String[] userIds, String message) {
//        for(String userId:userIds) {
//            Session session = sessionPool.get(userId);
//            if (session != null&&session.isOpen()) {
//                try {
//                    log.info("【websocket消息】 单点消息:"+message);
//                    session.getAsyncRemote().sendText(message);
//                } catch (Exception e) {
//                    e.printStackTrace();
//                }
//            }
//        }
//    }

}
  • 调用WSServe
@Configuration
public class ReceiveHandler {

    @RabbitListener(queues = {RabbitmqConfig.ORDER_RESULT_TOPIC})
    public void receive_order(OrderMQResult orderMQResult){
//        System.out.println("消费消息:"+JSON.toJSONString(orderMQResult));
        //找到客户端
        Session session = null;
        int count = 3;
        //超时重连
        while(count-- > 0){
            session = OrderWSServer.clients.get(orderMQResult.getToken());
            if(session!=null){
                //说明已经拿到了,发送消息
                try {
                    //消息需要是Json格式的
//                    session.getBasicRemote().sendText(orderMQResult.toString());
                    session.getBasicRemote().sendText(JSON.toJSONString(orderMQResult));
                } catch (IOException e) {
                    e.printStackTrace();
                }
                return ;
            }
            try {
                TimeUnit.MILLISECONDS.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

}

标签:WebSocket,socket,token,session,message,public,String
From: https://www.cnblogs.com/lwx11111/p/17607857.html

相关文章

  • 理解websocket
    引用:https://zhuanlan.zhihu.com/p/328459701.websocket协议: 2.websocket原理:与http协议一样,WebSocket协议也需要通过已建立的TCP连接来传输数据。具体实现上是通过http协议建立通道,然后在此基础上用真正的WebSocket协议进行通信,所以WebSocket协议和http协议是有一......
  • 在vue项目中封装WebSockets请求
    在Vue项目中封装WebSocket请求包括以下步骤:1.安装WebSocket库:首先,导入WebSocket库,例如`vue-native-websocket`或`socket.io-client`。根据项目需求选择适当的库,并根据官方文档进行安装和配置。2.创建WebSocket服务:在Vue项目中,可以创建一个WebSocket服务,用于管理连接、发送和接收......
  • websocket应用的是哪个协议
    WebSocket应用的是WebSocket协议。WebSocket是一种在单个TCP连接上进行全双工通信的协议,它允许在客户端和服务器之间建立持久性的连接,并支持双向实时数据传输。相比传统的HTTP请求-响应模式,WebSocket具有更低的延迟和更高的性能,适用于实时性要求较高的应用场景,如在线聊天、实时游戏......
  • websocket服务端,运行后始终无法连接的解决方案
    javax.websocket.DeploymentException:TheHTTPresponsefromtheserver[404]didnotpermittheHTTP解决办法:少两个文件:WebSocketConfig.java@ConfigurationpublicclassWebSocketConfig{/***注入一个ServerEndpointExporter,该Bean会自动注册使用@Server......
  • ESP32连接云服务器【WebSocket】
    ESP32连接云服务器【ESP32+宝塔面板】......
  • js实现websocket
    import{UserManager}from"@/utils/userManager.js";classwebSocketClass{constructor(url="ws://127.0.0.1:8088/",time=3){this.url=urlthis.filterMessagesList=[""];//服务端返回的内容message事件不监听的内容,不会再message返回......
  • 记录使用HPSocket.NET包开发WebSocket通讯,报错Could not decode a text frame as UTF-
    因工作需要开发Scada系统,使用到WebSocket通讯,网页客户端接收数据时发生CouldnotdecodeatextframeasUTF-8报错 通过网络检索,有多种说法,验证如下1、文本针和二进制针的数据发送方式都测试失败1stringkson=JsonConvert.Serialize......
  • 协议 tcp rpc http websocket
    传输层:tcp,udp应用层:http,grpc,websocket浏览器服务器太多了,互相沟通需要统一的协议,http主要用于B/S如果是公司内部,轻量小巧定制化,用rpchttp是半双工,同一时间,只能一方发送消息,客户发送请求,建立http连接后,通过header可以申请升级到websocket协议 待补充wireshark的抓包分析:......
  • Vue WebSocket的实现 含断线重连
    vue客户端 main.jsimport{createApp}from'vue'import{reactive}from'vue'importAppfrom'./App.vue'import{webSocketUrl}from'/public/static/config.json'letwebsock=null;constapp=createApp(App);......
  • 微信、QQ这类IM APP怎么做——谈谈WebSocket
    1、WebSocket的使用场景(1)社交聊天聊天特点:低延迟,高及时。(2)弹幕(3)多玩家游戏(4)协同编辑(5)股票基金实时报价(6)体育实况更新(7)视频会议/聊天(8)基于位置应用(9)在线教育(10)智能家居家里的智能设备的状态必须要实时展现到......