2013-11-01 10 views
0

서버에서 클라이언트로 메시지를 보내고 싶습니다. 나는 이걸 보았지만 네임 스페이스 인스턴스를 만들 수 없어서 사용할 수 없다. How to emit SocketIO event on the serverside서버 (django)에서 클라이언트 (socketio)로 알림을 푸시하는 방법은 무엇입니까?

사례보기 : 제품 가격 데이터베이스가 있습니다. 많은 사용자가 현재 내 웹 사이트를 서핑하고 있습니다. 그들 중 일부는 제품 X를보고 있습니다. 서버 측에서 관리자는 제품 가격을 편집 할 수 있습니다. X의 가격을 편집하면 모든 클라이언트는 X 가격이 변경되었다는 알림을보아야합니다 (e.x : 간단한 js 경고). 자바 스크립트 지금

내 클라이언트 :

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

이 문제에 대한 더러운 해결 방법이 있습니다. _connections 사전을 사용하여 현재 연결을 추적하십시오. 그런 다음 _connections.items() [0] [1] .emit_to_subscribers()를 사용하십시오. –

답변

0

이것은 현재 나의 이해 상태이며, 다른 사람에게 도움이되기를 바랍니다. How to emit SocketIO event on the serverside에서 더 나아가서, ProductsNamespace 오브젝트를 값으로 갖는 사전을 갖게되었습니다. 이 사전을 반복하여 원하는 소켓 객체를 찾을 수 있습니다. 만약 연결시 소켓 식별자를 설정할 경우, 예를 들어, on_nickname 방법을 사용하여 장고와 플라스 예 애플리케이션에 기술 된 바와 같이, 그런 다음과 같이 소켓을 검색 할 수

마찬가지로 socket.session['rooms']
for key in _connections: 
    socket = _connections[key] 
    if 'nickname' in socket.session and socket.session['nickname'] == unicode('uniqueName'): 
     socket.emit('eventTag', 'message from server') 

가 모두 방출하는데 사용될 수있다 여러 개의 SocketIO 네임 스페이스가있는 경우 socket.ns_name을 사용할 수 있습니다.

관련 문제