当前位置: 首页 > 知识库问答 >
问题:

带牛仔和websocket的erlang聊天室

白宏义
2023-03-14

我正在尝试用牛仔websocket处理程序创建一个聊天室。我希望那些来自每一个将转发到其他套接字以及,就像一个聊天组。我不知道该如何实施?我不知道如何保存连接到websocket的套接字,以便我们可以向它们发送消息。我有一个牛仔操纵者:

-module(chat_conn).

-export([ init/2
    , websocket_init/1
    , websocket_handle/2
    , websocket_info/2
    , terminate/3
    ]).

-include("chat.hrl").

init(Req, [WsConnIdleTimeout]) ->
    ?LOG_DEBUG("[CHAT-CONN] New HTTP Request on: /api , Pid: ~p", [self()]),
    WsOpts = #{idle_timeout => WsConnIdleTimeout},
    State = #{counter => 0},
    {cowboy_websocket, Req, State, WsOpts}.

websocket_init(State0) ->
    ?LOG_DEBUG("[FOOZI-CONN] HTTP Upgraded to WebSocketm pid: ~p", [self()]),
    NewState = State0,
    {ok, NewState}.

websocket_handle({text, PlainRequest}, #{counter := Counter0} = State) ->
    ?LOG_DEBUG("[HIGGS-CONN] Receive New Message: ~p, Pid: ~p" , [PlainRequest, self()]),
    NewCounter = Counter0 + 1,
    Reply = list_to_binary("Counter is: " ++ integer_to_list(NewCounter)),
    NewState = #{counter => NewCounter},
    {reply, {text, Reply}, NewState};
    %{ok, State};
websocket_handle(Frame, State) ->
    ?LOG_INFO("[HIGGS-CONN] Invalid Frame => ~p", [Frame]),
    {stop, State}.

websocket_info(Message, State) ->
    ?LOG_INFO("[CONN-INFO] Unhandled message! => Message: ~p", [Message]),
    {reply, {text, list_to_binary(Message)}, State}.
    %{ok, State}.

terminate(Reason, _, State) ->
    ?LOG_INFO("[CONN-TERMINATE] Terminated! => Pid: ~p, Reason: ~p, State: ~p", [self(), Reason, State]),
    ok.

共有1个答案

宗政学
2023-03-14

我不知道如何保存连接到websocket的套接字,以便向它们发送消息

在erlang中,可以使用gen_servers存储状态,因此您可以创建一个gen_serverwebsocket处理程序使用它来保存客户机PID。当客户端使用特定路由向您的牛仔服务器发送“开始聊天”消息时,将调用关联的websocket处理程序。在该处理程序中,self()将是该客户端的websocket进程的pid。您可以通过调用gen_server:cast(chat_room,{arrive,self()}),然后在chat_room:handle_cast()中将pid添加到存储在state变量中的pid列表中,将该pid保存在gen_server中。

当牛仔服务器从客户机浏览器接收到聊天消息时,客户机的websocket进程将处理该消息,并且在适当的websocket处理程序中,您可以查询gen_server以获得连接的客户机的PID列表。然后,您可以使用向每个用户发送消息。反过来,每个客户端的websocket_info()处理程序将处理消息,它可以通过websocket将消息中继回客户端,返回:{reply,{text,text},State}

对于gen_server,您还需要实现一个leave()函数,适当的websocket处理程序将调用该函数来更新存储在gen_server中的客户端列表,例如gen_server:cast(chat_room,{leave,self()})

 类似资料:
  • 本文向大家介绍Android使用Websocket实现聊天室,包括了Android使用Websocket实现聊天室的使用技巧和注意事项,需要的朋友参考一下 最近的项目中要实现一个聊天的功能,类似于斗鱼TV的聊天室功能,与服务器端人商量后决定用WebSocket来做,但是在这之前我只知道Socket但是听都没有听过WebSocket,但是查看了相关的材料以后发现实现一个聊天室其实是很简单的!下面我们

  • 本文向大家介绍用java WebSocket做一个聊天室,包括了用java WebSocket做一个聊天室的使用技巧和注意事项,需要的朋友参考一下 最近一个项目中,需要用到Java的websocket新特性,于是就学了一下,感觉这技术还挺好玩的,瞬间知道网页上面的那些在线客服是怎么做的了。 先看图: 实现了多客户机进行实时通讯。 下面看代码项目结构图:很简单,就1个类,1个页面 然后看具体代码 先

  • 我正在努力将Twilio可编程聊天集成到QT/QML应用程序中--这意味着我不能很容易地使用Javascript客户机SDK。我想有像打字指示符,令牌到期通知等功能,在我的客户机处理。 在示例中,客户端sdk直接启动到Twilio的WebSocket连接,并直接接收诸如令牌过期等事件。 Twilio似乎为Javascript、iOs和Android提供了许多SDK,这些SDK抽象了大多数特性(读取

  • 我刚在网上买了一个vps,并在上面安装了apache tomcat 8.0.20。服务器已启动并运行。然而,我的websocket应用程序在使用apache tomcat 8.0.3的localhost上运行得很好,它一直给出一个 错误。 我需要帮助,以知道是否有任何额外的配置我需要做。或者Mochahost不支持WebSockets。或者Tomcat服务器需要在没有Apache的情况下运行。请我

  • 本文向大家介绍使用WebSocket实现即时通讯(一个群聊的聊天室),包括了使用WebSocket实现即时通讯(一个群聊的聊天室)的使用技巧和注意事项,需要的朋友参考一下 随着互联网的发展,传统的HTTP协议已经很难满足Web应用日益复杂的需求了。近年来,随着HTML5的诞生,WebSocket协议被提出,它实现了浏览器与服务器的全双工通信,扩展了浏览器与服务端的通信功能,使服务端也能主动向客户端