在使用io.connect()的JavaScript中的HTML页面中,有没有办法捕获任何"onsend"事件?
我在不同的地方使用了很多"socket.send()",我需要"分类"并记录它们,如果我可以在"onsend"事件之类的东西中捕获它们(当我收到一些东西时,比如socket.on("message")...
我当然意识到我可以在全局函数中做到这一点,但由于解决方案是按原样编码的,因此需要大量重新编码才能做到这一点,并且重新测试不是一种选择......
啪!
如果其他人正在寻找答案,我将发布我正在使用的解决方法,可能并非在所有情况下都有效:
let socket = new WebSocket(wsUrl)
let original = socket.send
socket.send = (...args) => {
doSomethingOnSend()
return original.apply(socket, args)
}
您正在使用 socket.io 的默认事件来发送和接收消息。
这意味着,如果您从服务器向客户端发送消息,则使用
//On server side or server side
socket.send(someMessage);
//On another opposite side
socket.on("message", function(data){console.log(data);})
上述一种事件是内置在 socket.io 库中定义的。那是在他们的代码中的某个地方,例如
//On server side or client side
socket.send = socket.emit("message", someMessage);
//On opposite side
socket.on("message", function(data){console.log(data);})
因此,通过这种方式,我总是定义我的自定义事件,例如
//register a custom events on socket using socket.on function
socket.on("clientSentAData", function(data){console.log(data);})
//Client knows that there is a kind of evnets known as "clientSentAData" in the server side
//So client emit an data using "clientSentAData" event.
socket.emit("clientSentAData", data);
我这样我也对我的 bla bla 类型的消息/通知/数据进行分类。
更具体的例子
//Server code
//Server register the sendMeMusicFile event
socket.on("sendMeMusicFile", function(tileName){
console.log("Received client request file with title " + tileName);
socket.emit("takeYourMusicFile", theMusicFile);
console.log("Sent music file with title " + tileName);
});
//Client Code
//Ask for a music
socket.emit("sendMeMusicFile", "Just Give me a reason");
//Client register the takeYourMusicFile event
socket.on("takeYourMusicFile", function(theMusicFile){
console.log("Received music file with title " + theMusicFile.tile);
// player.play(theMusicFile)
});