2012-08-17 57 views
1

我想建立一个动态的网络应用程序,我发现sockjs非常有前途。推SockJS-erlang,Howto?

但是,我不知道如何将数据从服务器推送到客户端。文档(包括两个小例子)显示了一些«回声服务器»的例子。

但我会得到的是:

  • 用户打开带有sockjs的连接,然后我得到一个PID或ID
  • 那么我就可以将消息发送到这个PID推到浏览器

我不知道该怎么做。

这是他们处理

service_echo(_Conn, init, state)  -> {ok, state}; 
service_echo(Conn, {recv, Data}, state) -> Conn:send(Data); 
service_echo(_Conn, closed, state)  -> {ok, state}. 

,我想这样的事情

service_push(Conn, init, state) -> 
    Pid = Conn:pid(), 
    ---- here get user ID from cookies or another way ---- 
    push_service:register(user,UserID,Pid), 
    {ok, state}; 

service_echo(Conn, {recv, Data}, state) -> do_something:with(Data); 

service_echo(Conn, closed, state) -> service_push:unregister(Conn:pid()). 

然后我可以发送相关信息到康涅狄格州的PID和这个康涅狄格州将数据发送到客户端。

我不知道该怎么写。

谢谢

回答

1

那么,PID隐藏在'康恩'记录下。只要通过'Conn'即可。无论何时你想发送一些东西,都可以调用'Conn:send(Data)',就是这样。

在这个模型中,即使连接关闭,你仍然可以传递Conn。为了做到“正确”,你可以在每次连接创建时创建一个gen_server,并在那里封装Conn。这样你的代码将负责在应用程序和sockjs之间传递数据。

这里是我的代码,正是这么做的(但对于更复杂的项目): https://github.com/rabbitmq/rabbitmq-web-stomp/blob/master/src/rabbit_ws_sockjs.erl#L56

+0

我想我会创建一个事件侦听器将在与用户ID相关联的康涅狄格州的ETS查表关键。如果在表格中找到,那么我会通过sockjs转发事件。此ETS表中的注册和注销将分别发生在service_echo(_,init,_)和service_echo(_,closed,_)中。 (当然service_echo的命名方式不同,你认为它是正确的吗?Conn是否改变了,或者我能否将它存储在初始化的ETS中? 谢谢 – niahoo 2012-09-04 16:05:11