我为基本的网络聊天服务器设置了WebSocket连接。
现在,无论何时收到消息,都会将其发送到在屏幕上输出的功能。
socket.onmessage = function(msg){output(msg);}
但是,用户可以通过连接发送到服务器的某些技术命令引起技术响应,而不是在屏幕上输出。
如何获取紧随其中一条技术消息的服务器响应?
我是否在发送技术消息的代码块之后放了一个单独的socket.onmessage?我想这将采取所有未来的消息。我只想下一个。
想法?
答案 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]
中。然后使用你想要的。