精华内容
下载资源
问答
  • webSocket onmessage事件

    2017-01-18 07:41:56
    ws.onmessage = function(evt){ var em = $("#message em"); if(evt.data != 0){ em.css("display","block"); em.text(evt.data); } else { em.css("display","none")...
  • //经度 socket.onmessage = function (msg) { $("#messageId").append(msg.data + "\n"); var obj = JSON.parse(msg.data); lat = parseFloat(obj.lat); lng = parseFloat(obj.lng); } $("#messageId").append(lat +...
  • //调用websocket对象建立连接://参数:ws/wss(加密)://ip:port (字符串)var websocket = new WebSocket(wsServer);//onopen监听连接打开websocket.onopen = function (evt) {console.log('this is ...

    js

    var wsServer = 'ws://127.0.0.1:9502';

    //调用websocket对象建立连接:

    //参数:ws/wss(加密)://ip:port (字符串)

    var websocket = new WebSocket(wsServer);

    //onopen监听连接打开

    websocket.onopen = function (evt) {

    console.log('this is a test')

    //websocket.readyState 属性:

    /*

    CONNECTING 0 The connection is not yet open.

    OPEN 1 The connection is open and ready to communicate.

    CLOSING 2 The connection is in the process of closing.

    CLOSED 3 The connection is closed or couldn't be opened.

    */

    };

    //监听连接关闭

    websocket.onclose = function (evt) {

    console.log("Disconnected");

    };

    //onmessage 监听服务器数据推送

    websocket.onmessage = function (evt) {

    console.log(evt);

    // console.log('Retrieved data from server: ' + evt.data);

    };

    //监听连接错误信息

    websocket.onerror = function (evt, e) {

    console.log('Error occured: ' + evt.data);

    };

    php

    $serv = new Swoole\Websocket\Server("127.0.0.1", 9502);

    $serv->on('Open', function($server, $req) {

    echo "connection open: ".$req->fd;

    });

    $serv->on('Message', function($server, $frame) {

    echo "message: ".$frame->data;

    $server->push($frame->fd, json_encode(["hello", "world"]));

    });

    $serv->on('Close', function($server, $fd) {

    echo "connection close: ".$fd;

    });

    $serv->start();

    展开全文
  • 有问题的写法 @ClientEndpoint @Component public class SmkCenterConsumer { @Autowired private SmkCenterDataRepository repository; @OnMessage public void onMessage(String message) { ...

    有问题的写法

    @ClientEndpoint
    @Component
    public class SmkCenterConsumer {
    
        @Autowired
        private SmkCenterDataRepository repository;
        
         @OnMessage
        public void onMessage(String message) {
            repository.save(data);
        }
    }
    

    报错:

    [ ERROR] [2020-03-11 11:41:36] org.apache.tomcat.websocket.pojo.PojoEndpointBase [175] - No error handling configured for [SmkCenterConsumer] and the following error occurred
    java.lang.NullPointerException: null
    	at SmkCenterConsumer.onMessage(SmkCenterConsumer.java:45)
    

    正确的写法

    @ClientEndpoint
    @Component
    public class SmkCenterConsumer {
    	private static SmkCenterDataRepository repository;
    
        @Autowired
        public void setRepository(SmkCenterDataRepository repository) {
            SmkCenterConsumer.repository = repository;
        }
             @OnMessage
        public void onMessage(String message) {
            repository.save(data);
        }
    }
    

    背景知识

    在spring boot中引入

    compile('org.springframework.boot:spring-boot-starter-websocket')
    

    实际上涉及到下面三个层次的知识

    java websocket API(JSR-356)

    开发 WebSocket 的Java API 集合,比如javax.websocket.Endpoint

    spring websocket抽象

    实际上spring对websocket进行了一些api的抽象

    官方文档参考:websocket

    比如:org.springframework.web.socket.WebSocketHandler

    javadoc

    A handler for WebSocket messages and lifecycle events.

    spring无非就是把javax.websocket.Endpoint在onMessage的时候将相应的数据进行读取,传递到handleMessage()这个方法中,通过模板方法模式来重载

    spring boot整合websocket

    springboot使用编程方式javax.websocket.server.ServerContainer来部署websocket endpoint

    参考:spring boot中websocket endpoint是如何初始化及启动的

    原因

    通过jstack,查看线程,可以看到,每一个@ClientEndPoint实际上对应一个线程WebSocketClient-AsyncIO-digit(数字)

    org.apache.tomcat.websocket.AsyncChannelGroupUtil

    /**
     * This is a utility class that enables multiple {@link WsWebSocketContainer}
     * instances to share a single {@link AsynchronousChannelGroup} while ensuring
     * that the group is destroyed when no longer required.
     */
    public class AsyncChannelGroupUtil {
        
        // 使用线程池
        ExecutorService executorService = new ThreadPoolExecutor(
                        0,
                        Integer.MAX_VALUE,
                        Long.MAX_VALUE, TimeUnit.MILLISECONDS,
                        new SynchronousQueue<Runnable>(),
                        new AsyncIOThreadFactory());
        
        ......
        
        // 启动线程
        @Override
        public Thread run() {
            Thread t = new Thread(r);
            t.setName("WebSocketClient-AsyncIO-" + count.incrementAndGet());
            t.setContextClassLoader(this.getClass().getClassLoader());
            t.setDaemon(true);
            return t;
        }
    }
    

    可以看到,这个线程是tomcat启动的

    在这个tomcat启动的线程中如何使用spring容器提供的@Autowired的单例bean呢?

    如果不是static,这个repository就是null

    在这个线程中也没有办法从spring容器中取到这个bean,所以只能把这个bean设置为static,这样这个单例bean就脱离了spring容器的限制,可以在所有线程中使用了

    另一个思路:实现BeanFactoryAware,这样可以通过注入的BeanFactory拿到这个bean,应该也是可行的

    展开全文
  • 多个 socket.send方法不要并行放在一起,会线程冲突

    多个

    socket.send方法不要并行放在一起,会线程冲突
    展开全文
  • 问题描述:使用Tomcat自带的WebSocket实现,实现了我自己的服务器端程序,但是启动服务器时,发生这样的错误: No payload parameter present on the method [onMessage];查阅官方文档无果。 请教:这里的payload...
  • 本来前端通过js是可以成功建立WebSocket连接的,但是前端使用WebSocket发给后台的消息,后台却怎么也收不到。 以下是问题描述与解决办法。 二、问题描述 1.前端建立WebSocket连接的关键代码样例如下: var msg="abc...

    一、前言

    最近新写了一个Java WebSocket后台,用来和前端通信;本来前端通过js是可以成功建立WebSocket连接的,但是前端使用WebSocket发给后台的消息,后台却怎么也收不到。

    以下是问题描述与解决办法。

    二、问题描述

    1.前端建立WebSocket连接的关键代码样例如下:

    var msg="abc123";
    //var imUrl="wss://10.123.123.123:9999/api/im";
    var imUrl="ws://10.123.123.123:9999/api/im";
    
    _createIM(msg){
      this.im = new IM({
        url: imUrl,
        msg
      })
      return this.im.connect()
    }
    
    //调用
    this._createIM(msg);
    

    这段代码就是前端建立WebSocket连接的方法,同时给后台发送了消息(abc123)。

    2.后台关键WebSocket代码样例如下:

    @OnOpen
    public void onOpen(Session session, EndpointConfig config) throws IOException {
      this.session = (WsSession)session;
      //这句是想把webSocket的Session转换为HttpSession的,但是加了没有用
      //this.httpSession = (HttpSession)config.getUserProperties().get(HttpSession.class.getName());
      
      //打印日志记录
      log.info("webSocket, sessionId : ["+session.getId()+"] 已连接");
    }
    
    @OnMessage
    public void onMessage(String message) throws IOException{
      log.info("webSocket后台收到消息:"+message);
    }
    
    

    3.样例如上,前端js执行后,建立webSocket连接,后台onOpen方法中的log.info会成功打印日志

    4.但是,前端发给后台的消息(abc123)、后台并没有收到,后台的onMessage方法并没有打印日志

    5.个人从前端js代码中推测,也许消息(abc123)是在建立连接的同时发送给后端的,可能消息在WebSocket的session中;于是各种修改onOpen方法,尝试从Session中获得消息,但是没有成功。

    6.个人尝试了把WebSocket的Session转换为HttpSession,但是没有成功,HttpSession一直为null。

    三、解决办法

    1.通过百度发现,WebSocket有4种消息类型,BinaryMessage,PingMessage,PongMessage,TextMessage

    2.打断点查看onOpen中的WebSocket中的Session对象,发现textMessageHandler(MessageHandler类型)是有值的,但是binaryMessageHandler(MessageHandler类型)是null。

    3.想办法让binaryMessageHandler不为null,于是增加了如下代码:

    @OnMessage
    public void onMessage(byte[] message) throws IOException{
      String msg = new String(message, "utf-8");
      log.info("webSocket后台收到消息:" + msg);
    }
    

    终于,这样收到消息了;但是消息前半部分为乱码,不知道为什么。

    5.优化上方的方法,如下:

    @OnMessage
    public void onMessage(byte[] message) throws IOException{
      byte[] data = Arrays.copyOfRange(message, 50, message.length);
      String msg = new String(data, "utf-8");
      log.info("webSocket后台收到消息:" + msg);
    }
    
    

    上方代码中对byte数组进行了截取,然后转换为String。

    到此,终于成功收到了前端传给后端的消息(abc123)。

    四、总结

    1.上方代码中,前端建立WebSocket连接的同时给后端发送了消息,但是,与HttpSession不同,WebSocket的Session中并不保存消息。

    2.后端使用@OnMessage注解方法接收消息时,需要注意
    (1)如果前端给后端发送的是TextMessage类型的,就这样接收:

    @OnMessage
    public void onMessage(String message) {}
    

    (2)如果前端给后端发送的是BinaryMessage类型的,就这样接收:

    @OnMessage
    public void onMessage(byte[] message) {}
    

    (3)PingMessage与PongMessage的发送与接收方法,暂未研究。

    展开全文
  • 就在这个时候,房主再次选择答案进行再次onMessage交互。此时问题就出现了,前端发了消息(确定发了),但是后端需要等待很久(20S左右)才能收到。 经反复检查,发现假设:房主点击开始比赛时用的是1号线程,他选择...
  • WebSocket 教程

    2019-07-09 10:07:35
    WebSocket是一种网络通信协议,很多高级功能都需要它。 本文介绍 WebSocket 协议的使用方法。 一、为什么需要 WebSocket? 初次接触 WebSocket 的人,都会问同样的问题:我们已经有了 HTTP 协议,为什么还需要...
  • WebSocket的使用

    2019-05-18 18:22:16
    websocket相当于一个连接客户端和服务器端的管道,可以长时间的进行保持,直到人工将管道通信关闭。它和servlet的不同之处就在于servlet进行浏览器和服务器进行数据交互时,servlet创建的通信管道需要频繁地进行创建...
  • websocket事件绑定

    2021-01-04 22:33:38
    this.websocketService.webSocket.onmessage = (e)=>{ this.wedSocketMessageHandler(e); }
  • 如题,websocket已经成功连接,readystate状态码是1(已建立连接可通讯的意思),后台向前台推送的数据其实是可以接收到的,但是只能靠我手动刷新页面,他才会调用一次onmessage回调方法,没有办法实时接收到数据,...
  • #### 如下所示,在vue中我共用一个websocket连接,一次发送多条指令,那么,此时onmessage会得到四个返回的结果集,如何去区分这四个结果集对应的是哪条指令呢,求解惑~ ``` ws.send(JSON.stringify(this.$Command...
  • 现在的情况是这样的,...代码如下,主要是 Websocket 收到消息是走 OnMessage,我没想出好办法做这个处理,目前的处理办法就是在接到 HTTP 请求的时候,往数据库里加一条记录,然后一直使用这个记录 ID 循环查询数据库,...
  • // websocket.jsexport function initWebsocket(user = {}, userType) {socketurl = "ws://" + WEBSOKET_URL + "//////"ws = new WebSocket(socketurl);ws.onopen = function (evt) {wsReadyState = evt.currentTarg...
  • Websocket接收和发送消息

    千次阅读 2021-03-09 03:49:07
    本篇文章帮大家学习Websocket接收和发送消息,包含了Websocket接收和发送消息使用方法、操作技巧、实例演示和注意事项,有一定的学习价值,大家可以用来参考。通常在服务器发送一些数据时发生Message事件。服务器...
  • websocket.onmessage = function (event) { //将接收到的二进制数据转为字符串 var unit8Arr = new Uint8Array(event.data) ; setMessageInnerHTML(byteToString(unit8Arr)); } //连接关闭的回调方法 ...
  • WebSocket 处理事件

    2019-01-11 13:36:00
    WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。 ...
  • WebSocket的事件触发机制

    万次阅读 2018-01-10 22:11:59
    WebSocket API是纯事件驱动的。应用程序代码监听WebSocket对象上的事件,以便处理输入数据和连接状态的改变。WebSocket协议也是事件驱动的。客户端应用程序不需要轮询服务器来得到更新的数据。消息和事件将在服务器...
  • websocket的使用封装

    2019-11-27 09:15:45
    现在目录创建一个socket.js,代码如下 var websock = null var globalCallback = null // 初始化weosocket function initWebSocket () { ... var ws= 'wss://*********/webSocket'; websock = new Web...
  • websocket异步通信

    2021-01-29 09:07:15
    websocket异步通信
  • java集成WebSocket向指定用户发送消息

    万次阅读 多人点赞 2018-03-01 15:54:48
    一.WebSocket简单介绍 随着互联网的发展,传统的HTTP协议已经很难满足Web应用日益复杂的需求了。近年来,随着HTML5的诞生,WebSocket协议被提出,它实现了浏览器与服务器的全双工通信,扩展了浏览器与服务端的通信...
  • websocket的使用过程(前端视角)前一段时间需要做一个关于监控服务器的需求,如果某个服务器挂了就需要在前端展示,定时请求又很。。。就想到了 websocket 服务器自动推送的技术,记录一下我使用的全过程,希望对...
  • WebSocket 协议在2008年诞生,2011年成为国际标准。所有浏览器都已经支持了。 它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送技术的...
  • WebSocket四种事件详解 入门篇(二)

    千次阅读 2018-09-18 23:19:59
    示例代码 在文章最下方,可以根据示例代码和讲解来理解整个WebSocket流程。代码用SpringBoot 和 maven搭建   服务端和客户端四种事件 1、打开事件  此事件发生在端点上建立新连接时并且在任何其他时间发生...
  • 带心跳的webSocket的使用和封装

    千次阅读 2019-01-23 17:11:13
    一、webSocket简介  webSocket是一种网络通信协议,由于HTTP只能实现客服端向服务器的单向通信,即只能客户端主动给服务器发请求,服务器却没有办法主动“联系”客户端,所以全双工通信的webSocket应运而生,以便...
  • tomcat7提供的与WebSocket相关的类均位于包org.apache.catalina.websocket之中(包org.apache.catalina.websocket的实现包含于文件catalina.jar之中   这里我们把tomcat的全部导入就行了 在build ...
  • 依赖包是websocket,yarn和npm自己选自己的 #npm npm install websocket #yarn yarn add websocket 由于我的项目是nestjs的,当然你的不是也能使用的。我会把我全部依赖挂在文章最后。 使用代码 export const W3...
  • springboot + websocket实现消息推送Springboot集成webSocket Springboot集成webSocket 直接撸代码 @ServerEndpoint(prefix = "netty-websocket") @Slf4j @Component public class WebSocket { // private static ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 22,959
精华内容 9,183
关键字:

websocket的onmessage