使用gproc:send时,N2O协议发送空数据

时间:2017-03-10 17:01:21

标签: websocket erlang cowboy n2o

我创建了一个N2o协议,用于在不同的应用程序系列上路由消息,(之前我使用了一个牛仔websocket处理程序来完成这项工作)

例如,我在我的协议中使用此代码向已注册的进程发送消息

> info({text,<<"REG:",Msg/binary>> }, Req, State) ->    
> {[{_,Family}]}=jiffy:decode(Msg),     Test = gproc:reg({p, l, Family},
> 1),   {reply, <<"process registered successfully">>, Req, State};




info({text,<<"TRANSMIT:",Msg/binary>> }=M, Req, State) ->
    {[{_,Type},{_,Action},{_,From},{_,To},{_,Message}]}=jiffy:decode(Msg),
     gproc:send({p, l, To}, {self(),<<"Hi I am a good message!">>}),
      {reply, <<"message transmitted successfully">>, Req, State};

在我的HTML客户端中,首先我使用

在协议下注册
  

var msg = {family:&#34; JS&#34;};       websocket.send(&#34; REG:&#34; + JSON.stringify(msg));

我确认我的html进程注册良好

然后,从我的同一个HTML客户端,我调用了传输协议方法,如:

  

msg = {Type:&#34; TRANSMIT:&#34;,Action:&#34; Chat&#34;,From:&#34; JS&#34;,To:&#34; JS&#34 ;,       消息:&#34;你好我是Js&#34;};       websocket.send(&#34; TRANSMIT:&#34; + JSON.stringify(msg));

基本上在这个阶段我应该收到一条包含&#34;你好我是Js&#34;在我的HTML客户端中,但总是收到一个空数据字符串,如:

  

MessageEvent {isTrusted:true,data:&#34;&#34;,origin:   &#34; ws://192.168.1.20:8000&#34;,lastEventId:&#34;&#34;,source:null ...}

信息:

我收到的回复信息如下:

注册过程时:

  
    

MessageEvent {isTrusted:true,data:&#34;进程已注册     成功&#34;,来源:&#34; ws://192.168.1.20:8000&#34;,lastEventId:&#34;&#34;,     来源:null ...}

  

提交邮件时:

  

MessageEvent {isTrusted:true,data:&#34;消息已传输   成功&#34;,来源:&#34; ws://192.168.1.20:8000&#34;,lastEventId:&#34;&#34;,   来源:null ...}

当我使用我的牛仔ws处理程序时,我没有遇到过这样的问题。

1 个答案:

答案 0 :(得分:2)

  

心脏协议定义了客户端发起的消息N2O,PING和服务器发起的消息PONG,IO和NOP。 IO消息包含包含UTF-8 JavaScript字符串的EVAL,DATA回复包含任何二进制字符串,包括BERT编码数据。 &#34; PING&#34;和&#34; N2O,&#34;被定义为文本4字节消息,第二个可以跟随任何文本字符串。 NOP是0字节的确认包。

来自N2O文档:http://synrc.com/apps/n2o/doc/web/protocols.htm#sec11

如果您想违反N2O协议,您应该创建自己的原始自定义协议模块:

-module(protocol).
-include_lib("n2o/include/wf.hrl").
-compile(export_all).

event(Event)      -> ok.
finish(State,Ctx) -> {ok,State,Ctx}.
init(State,Ctx)   -> wf:reg(topic), {ok,State,Ctx#cx{module=protocol}}.

info({text,Text}=Message, Req, State) -> {reply, Text, Req, State};
info(Message, Req, State) -> {unknown,Message, Req, State}.

确保在sys.config中仅为所有处理程序启用protocol

{n2o, [{protocols,[protocol]},
       {query,protocol},
       {session,protocol},
       {route,protocol}]},

用法:

wscat -c ws://127.0.0.1:9000/
connected (press CTRL+C to quit)
> echo
< echo