0

我创建了一个 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: "JS"}; websocket.send("REG:"+JSON.stringify(msg) );

并且我验证了我的 html 进程已经很好地注册了

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

msg = {Type: "TRANSMIT:", Action: "Chat", From: "JS", To: "JS", Message:"Hello I am Js"}; websocket.send("传输: "+JSON.stringify(msg) );

基本上在这个阶段,我应该在我的 HTML 客户端中收到一条包含“Hello I am Js”的消息,但我总是收到一个空数据字符串,例如:

MessageEvent {isTrusted: true, data: "", origin: "ws://192.168.1.20:8000", lastEventId: "", source: null…}

信息:

我很好地收到了回复信息如下:

注册过程时:

MessageEvent {isTrusted: true, data: "进程注册成功", origin: "ws://192.168.1.20:8000", lastEventId: "", source: null…}

提交消息时:

MessageEvent {isTrusted: true, data: "消息传输成功", origin: "ws://192.168.1.20:8000", lastEventId: "", source: null…}

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

4

1 回答 1

2

心脏协议定义了客户端发起的消息 N2O、PING 和服务器发起的消息 PONG、IO 和 NOP。IO 消息包含 EVAL,其中包含 UTF-8 JavaScript 字符串,DATA 回复包含任何二进制字符串,包括 BERT 编码数据。“PING”和“N2O”被定义为 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}.

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

{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
于 2017-03-11T11:42:01.240 回答