我想从服务器向客户端发出消息。 我看过这个但是无法使用,因为我无法创建命名空间实例。 How to emit SocketIO event on the serverside
我的用例是: 我有一个产品价格数据库。目前很多用户都在浏览我的网站。他们中的一些人正在查看产品X. 在服务器端,管理员可以编辑产品的价格。如果他编辑X的价格,所有客户都必须看到X价格变化的通知(e.x:简单的js警报)。
我的客户端javascript现在:
var socket = io.connect('/product');
#notify server that this client is viewing product X
socket.emit("join", current_product.id);
#upon receive msg from server
socket.on('notification', function (data) {
alert("Price change");
});
我的服务器代码(socket.py):
@namespace('/products')
class ProductsNamespace(BaseNamespace, ProductSubscriberMixin):
def initialize(self, *args, **kwargs):
_connections[id(self)] = self
super(ProductsNamespace, self).initialize(*args, **kwargs)
def disconnect(self, *args, **kwargs):
del _connections[id(self)]
super(ProductsNamespace, self).disconnect(*args, **kwargs)
def on_join(self, *args):
print "joining"
def emit_to_subscribers(self): pass
我在此link中使用runserver_socketio.py。 (感谢Calvin Cheng提供了这个优秀的最新例子。)
我不知道如何调用emit_to_subscribers。因为我没有命名空间的实例。 当我读到这个doc时,
只有在请求命名空间的某些数据包到达时才会创建命名空间。
但是如何从代码中将数据包发送到该命名空间?如果我只能在客户端向服务器发送消息时创建实例,当没有人浏览网站时,在完成编辑价格后,系统将会失败。
我对命名空间及其实例感到困惑。如果您有更清晰的文档,请帮助我。
非常感谢!
答案 0 :(得分:0)
这是我目前的理解状态,希望它对某人有所帮助。从How to emit SocketIO event on the serverside进一步构建,您现在拥有一个以ProductsNamespace
个对象作为值的字典。您可以遍历此字典以查找所需的套接字对象。例如,如果您在连接时设置套接字标识符,如使用on_nickname
方法在Django和Flask示例应用程序中所述,那么您可以像这样检索套接字:
for key in _connections:
socket = _connections[key]
if 'nickname' in socket.session and socket.session['nickname'] == unicode('uniqueName'):
socket.emit('eventTag', 'message from server')
类似地,socket.session['rooms']
可用于向房间的所有成员发出,如果有多个SocketIO名称空间,则可以使用socket.ns_name
。