如何从websocket连接中选择特定的服务器消息?

时间:2012-05-14 02:12:12

标签: javascript jquery websocket

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

现在,无论何时收到消息,都会将其发送到在屏幕上输出的功能。

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

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

如何获取紧随其中一条技术消息的服务器响应?

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

想法?

2 个答案:

答案 0 :(得分: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);
    }
};

答案 1 :(得分:0)

您可以通过特殊字符对数据进行分组,形成如下字符串:

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

然后,您可以在javascript中拆分字符串,如下所示:

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

因此,未显示的数据位于recv[0]中,数据显示在recv[1]中。然后使用你想要的。