2012-08-17 61 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