我必须说我对Misultin对 Web Sockets 的支持印象深刻(这里有一些例子)。我的 JavaScript 正在以“可忽略的”延迟或滞后发出请求并通过网络获取响应,太好了!
看看 WebSockets 的数据处理程序循环的样子,它类似于普通的 TCP/IP 套接字,至少是 Erlang 中的基本方式
% 回调收到的 websockets 数据
handle_websocket(Ws) ->
收到
{浏览器,数据} ->
ws:send(["received '", Data, "'"]),
handle_websocket(Ws);
_忽略->
handle_websocket(Ws)
5000 之后 ->
ws:send("推!"),
handle_websocket(Ws)
结尾。
这段代码在由 Misultin 生成的进程中执行,这是您在启动服务器时为其提供的功能,如下所示:
开始(端口)->
HTTPHandler = fun(Req) -> handle_http(Req, Port) 结束,
WebSocketHandler = fun(Ws) -> handle_websocket(Ws)结束,
选项 = [{port, Port},{loop, HTTPHandler},{ws_loop, WebSocketHandler}],
misultin:start_link(选项)。
. 有关此的更多代码,请查看示例页面。我有几个问题。
问题 1:我可以像我们通常在 Erlang 中使用 TCP/IP 套接字一样更改 Web 套接字的控制进程吗?(我们通常使用
gen_tcp:controlling_process(Socket,NewProcessId):)问题 2: Misultin是唯一支持 WebSockets 的 Erlang/OTP HTTP 库吗?其余的在哪里?
编辑: 现在,我需要能够从 Misultin 传输 WebSocket 控件的原因
想一想
gen_server将控制 WebSocket 池的一个,比如它是一个游戏服务器。在当前的 Misultin 示例中,对于每个 WebSocket 连接,都有一个控制进程,换句话说,对于每个 WebSocket,都会有一个衍生进程。现在,我知道 Erlang 是 Processes 的英雄,但是,我不希望这样,我希望这些初始进程在处理到我gen_server的 WebSocket 控制权限后立即终止。我希望这
gen_server可以在这些 WebSocket 之间切换数据。在当前的实现中,我需要Pid像这样跟踪 Misultin 的 handle_websocket 进程:
%% 这里是misultin的控制流程
%% 我得到它的 Pid 并将它保存在某个地方
%% 并将其链接到 my_gen_server 以便
%% 如果它退出我知道它已经消失了
handle_websocket(Ws)->
process_flag(trap_exit,true),
PID =自我(),
链接(my_gen_server),
保存连接(PID),
等待消息(WS)。
wait_msgs(Ws)->
收到
{浏览器,数据}->
FromPid = self(),
send_to_gen_server(数据,FromPid),
handle_websocket(Ws);
{广播,消息} ->
%% 我可以广播到所有连接的 WebSockets
ws:发送(消息),
handle_websocket(Ws);
_Ignore -> handle_websocket(Ws)
结尾。
上面,这个想法非常有效,我将所有控制过程保存到 Mnesia Ram 表中,如果应用程序想要向该特定用户发送消息,则根据给定标准查找它。但是,根据我想要实现的目标,我意识到在现实世界中,进程可能太多以至于我的服务器可能会崩溃。我希望至少有一个gen_server来控制数千个 Web Socket,而不是为每个 Web Socket 拥有一个进程,这样,我可以节省一些内存。
建议: Misultin 的作者可以在他的下一个版本中为我们创建 Web Socket Groups 实现,从而我们可以让一组 WebSockets 由同一进程控制。这将类似于Nitrogen's Comet Groups其中彗星连接在同一控制下组合在一起。如果这不可能,我们将需要自己进行控制,提供一个 API,我们可以在其中接管这些 Web 套接字的控制。
工程师们对此有何看法?
您对此有何建议和/或评论?
米苏尔廷的作者可以对此说些什么。谢谢大家