【问题标题】:How can I pick out a particular server message from a websocket connection?如何从 websocket 连接中挑选出特定的服务器消息?
【发布时间】:2013-02-26 19:47:14
【问题描述】:

我为基本的网络聊天服务器设置了 WebSocket 连接。

现在,无论何时收到一条消息,它都会被发送到一个函数,该函数将它输出到屏幕上。

socket.onmessage = function(msg){output(msg);}

但是,用户可以通过连接向服务器发送某些技术命令,这些命令会引发技术响应,而不是在屏幕上输出。

如何获取紧随这些技术消息之一的服务器响应?

我是否在发送技术消息的代码块之后放置一个单独的 socket.onmessage?我想这将需要所有未来的消息。我只想要下一个

想法?

【问题讨论】:

    标签: javascript jquery websocket


    【解决方案1】:

    WebSockets 是异步的,因此尝试接收“下一条”消息不是正确的解决方案。可以同时在两个方向上发送多条消息。此外,Javascript 中的大多数操作都是由异步事件(超时触发或用户点击某物)触发的,这意味着您无法同步控制何时发送。此外,onmessage 处理程序是一个持久设置:一旦设置它,它就会接收所有消息,直到它被取消设置。您需要有某种方法来区分消息本身中的控制消息和数据消息。如果您需要将响应与发送的消息相关联,那么您还需要某种消息序列号(或其他形式的唯一消息 ID)。

    例如,这向服务器发送一个控制消息,并有一个消息处理程序可以区分控制和消息以及其他消息:

    var nextSeqNum = 0;
    ...
    msg = {id: nextSeqNum, mtype: "control", data: "some data"};
    waitForMsg = nextSeqNum;
    nextSeqNum += 1;
    ws.send(JSON.stringify(msg));
    ...
    ws.onmessage = function (e) {
        msg = JSON.parse(e.data);
        if (msg.mtype === "control") {
            if (msg.id === waitForMsg) {
                // We got a response to our message
            } else {
                // We got an async control message from the server
            }
        } else {
            output(msg.data);
        }
    };
    

    【讨论】:

      【解决方案2】:

      您可以将数据打包,我的意思是,通过特殊字符/s,形成这样的字符串:

      "DataNotToBeShown"+"$$"+"DataToBeShown"; //if $$ is separating character
      

      然后,您可以像这样在 javascript 中拆分字符串:

      var recv=msg.data.split('$$');
      

      因此,未显示的数据在recv[0] 中,要显示的数据在recv[1] 中。然后随心所欲地使用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多