如何在socket.io上执行RPC?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在socket.io上执行RPC?相关的知识,希望对你有一定的参考价值。
假设我们有一个简单的echo服务器(在第一次请求时调整得更长):
var waiting = 8000;
io.on('connection', function(socket){
socket.on('doEcho', function (data) {
setTimeout( function () {
socket.emit('echoDone', data);
}, waiting);
waiting = 1;
});
});
然后说一个index.html
客户端脚本:
askEcho ("11111", function (resp) {
console.log("answer for 11111 " + resp);
});
askEcho ("22222", function (resp) {
console.log("answer for 22222 " + resp);
});
其中askEcho
是以下buggy函数,假装是一个RPC存根:
function askEcho (text, fun) {
socket.emit('doEcho', text);
socket.on('echoDone', function (data) {
fun ( data );
});
}
显然我得到的是下面的混乱
answer for 11111 22222 answer for 22222 22222 answer for 11111 11111 answer for 22222 11111
因为我为同一个事件安装了两个监听器。这可以轻松解决,但我没有看到如何在客户端正确订购响应,没有服务器端的帮助(编程更多)。
这一切似乎都有点太多的负担。不能将askEcho
函数编码正确且容易吗?
答案
实际上,有一个简单的技巧:使用计数器来区分答案,并在完成后删除回调(甚至更好地使用once
而不是on
)。这只会在服务器端和客户端进行微小的更改。
我们来表明一下:
echo服务器(现在没有任何延迟超时):
io.on('connection', function(socket){
socket.on('doEcho', function (callCounter, data) {
socket.emit('echoDone'+callCounter, data);
});
});
在客户端(index.html
),用户代码仍然是相同的,如所需:
askEcho ("11111", function (resp) {
console.log("answer for 11111 " + resp);
});
askEcho ("22222", function (resp) {
console.log("answer for 22222 " + resp);
});
这是与服务器端团队协作正常的存根askEcho
:
var callCounter = 0;
function askEcho (text, fun) {
var localCallCounter = ++callCounter;
socket.emit('doEcho', localCallCounter, text);
socket.once('echoDone'+localCallCounter, function (data) {
// not required: socket.removeListener ('echoDone'+localCallCounter);
fun ( data );
});
}
另一答案
使用socket.io,您可以通过回调发送和接收确认。
见:http://socket.io/docs/#sending-and-getting-data-(acknowledgements)
以上是关于如何在socket.io上执行RPC?的主要内容,如果未能解决你的问题,请参考以下文章
如何在同一个弹性beantalk实例上运行socket.io和表达?