【发布时间】:2013-08-15 22:06:56
【问题描述】:
我在一个简单的聊天应用程序中有一个service_echo 函数,它使用 SockJS 来实现多用户私人聊天。我为在线用户列表创建了一个 ETS 表。通过存储 SockJS 会话,我想在收到来自不同连接的消息时向该连接发送消息。
这是我的service_echo 代码。
service_echo(Conn, {recv, Data}, state) ->
Obj = mochijson2:decode(Data),
{struct, JsonData} = Obj,
Name = proplists:get_value(<<"name">>, JsonData),
A = ets:lookup(username,Name),
io:format("~p",[Conn]),
if
length(A) =:= 0 ->
ets:insert(username,{Name,Conn});
true ->
[{AA,BB}] = ets:lookup(username,Name),
BB:send(Data)
end,
io:format("hello");
即使 Conn 和 BB 相同,Conn:send(data) 仍然会向浏览器发送有效数据,而 BB:send(Data) 什么也不做,甚至不显示错误。
由于我是 Erlang 新手,如有任何无意的错误,请见谅。
【问题讨论】:
-
这真的是您一直在运行的代码,还是您为 StackOverflow 单独输入的?例如,您在第一行中使用了小写的“状态”,因此该函数将永远无法工作。为了帮助人们回答,请确保显示您尝试运行的确切代码。
-
StateEcho = sockjs_handler:init_state( <<"/echo">>, fun service_echo/3, state, [{response_limit, 4096}]),调用 service_echo 函数。这是我正在运行的代码,但BB:send(Data)没有发送消息。 -
这段代码,无法编译,Var - 第 12 行 - 未绑定。正如理查德所说,有些信息是错误的。无论如何,为了能够帮助您,知道您在 BB 中存储了什么可能很有趣,因为模块 BB 中的函数 send/1 负责发送消息 - 第 13 行。
-
@Pascal 我在发布问题之前进行了一些编辑以使其变得简单。谢谢。 BB 与 Conn 相同,它是通过 websockets 的 SockJS 连接。输出的 io:format for Conn 看起来像
{<0.161.0>, [{peername,{{127,0,0,1},56247}}, {sockname,{{127,0,0,1},56247}}, {path,"/echo/039/62l0slqe/websocket"}, {headers,[]}]}}。令人讨厌的是 Conn:send 工作,而通过模式匹配与 Conn 相同的 BB 不工作按照康恩的工作方式工作。BB:send()不工作。
标签: sockets erlang pattern-matching sockjs