我正在使用socket.io将智能手机(在网页框架中)连接到服务器并发送一些消息(每分钟几个短字符串,没什么大不了的)。由于智能手机往往具有不稳定的连接,因此socket.io不时会被重新连接。它会自动执行此操作,并且在注意到连接当前不可用后,我希望它发送的消息将被缓冲,并在重新建立连接后作为一个包发送。所以基本上它与socket.io一样顺利。
但是当我在socket.io发出消息之前发现连接消失时,消息就丢失了。它无法传输,但也没有被socket.io缓冲。我对socket.io非常满意,但这个问题让我烦恼,因为我不发送很多消息,但我真的需要那些我发送的可靠发送。建立连接后,所有消息都会完美传输,因此我无需检查。只有连接丢失和socket.io之间的第二个注意到它是我面临数据包丢失的关键时刻。
我一直在考虑使用序列号和ACK来模仿TCP行为,但感觉有点像使用火箭发射器射击蚂蚁。所以我的问题是:有没有人有这个问题的轻量级解决方案,甚至自己遇到过?我甚至没有要求明确的代码 - 我可以自己做 - 但是一个概念或类似的东西来摆脱这个特定的问题会很棒。
提前致谢!
答案 0 :(得分:3)
为什么不将每条消息都记录到数据库中? 并使用socket.io确认选项使其更好。
来自http://socket.io/#how-to-use的服务器
var io = require('socket.io').listen(80);
io.sockets.on('connection', function (socket) {
socket.on('ferret', function (name, fn) {
fn('woot');
});
});
客户端
<script>
var socket = io.connect(); // TIP: .connect with no args does auto-discovery
socket.on('connect', function () { // TIP: you can avoid listening on `connect` and listen on events directly too!
socket.emit('ferret', 'tobi', function (data) {
console.log(data); // data will be 'woot'
});
});
</script>
答案 1 :(得分:0)
如果这很重要,我可能会模仿天真的TCP版本。只需存储缓冲客户端,让服务器响应确认消息,否则再从缓冲区发送。