使用 socketio 与客户端同步应用程序状态
Syncing app state with clients using socketio
我是 运行 一个带有 SocketIO 的节点服务器,它保存一个定期更新的大对象(应用程序状态)。
所有客户端在连接到服务器后都会收到该对象,并应使用套接字(只读)保持实时更新。
以下是我的考虑:
1:
更新后使用 diff
向客户端发送变化增量
(需要处理交付和丢失更新的可靠性)
2:
使用 diffsync
包(但是它允许客户端将更改推送到服务器,但我需要更新是单向的,即服务器-->客户端)
我相信应该有现成的解决方案来解决这个问题,但我找不到明确的答案。
解决方法很简单。您必须 modify the server 以便它只接受来自受信任客户端的更新。
let Server = require('diffsync').Server;
let receiveEdit = Server.prototype.receiveEdit
Server.receiveEdit = function(connection, editMessage, sendToClient){
if(checkIsTrustedClient(connection))
receiveEdit.call(this, connection, editMessage, sendToClient)
}
// TODO: implement backup workflow
// has a low priority since `packets are not lost` - but don't quote me on that :P
console.log('error', 'patch rejected!!', edit.serverVersion, '->',
clientDoc.shadow.serverVersion, ':',
edit.localVersion, '->', clientDoc.shadow.localVersion);
第二个选项是尝试根据 jsondiffpatch
找到另一个解决方案
我是 运行 一个带有 SocketIO 的节点服务器,它保存一个定期更新的大对象(应用程序状态)。
所有客户端在连接到服务器后都会收到该对象,并应使用套接字(只读)保持实时更新。
以下是我的考虑:
1:
更新后使用 diff
向客户端发送变化增量
(需要处理交付和丢失更新的可靠性)
2:
使用 diffsync
包(但是它允许客户端将更改推送到服务器,但我需要更新是单向的,即服务器-->客户端)
我相信应该有现成的解决方案来解决这个问题,但我找不到明确的答案。
解决方法很简单。您必须 modify the server 以便它只接受来自受信任客户端的更新。
let Server = require('diffsync').Server;
let receiveEdit = Server.prototype.receiveEdit
Server.receiveEdit = function(connection, editMessage, sendToClient){
if(checkIsTrustedClient(connection))
receiveEdit.call(this, connection, editMessage, sendToClient)
}
// TODO: implement backup workflow
// has a low priority since `packets are not lost` - but don't quote me on that :P
console.log('error', 'patch rejected!!', edit.serverVersion, '->',
clientDoc.shadow.serverVersion, ':',
edit.localVersion, '->', clientDoc.shadow.localVersion);
第二个选项是尝试根据 jsondiffpatch