0

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

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

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

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

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

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

想法?

4

2 回答 2

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);
    }
};
于 2012-05-14T14:22:53.497 回答
0

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

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

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

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

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

于 2012-05-14T23:35:00.987 回答