我正在尝试用牛仔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.
我不知道如何保存连接到websocket的套接字,以便向它们发送消息
在erlang中,可以使用gen_servers存储状态,因此您可以创建一个gen_server
,websocket处理程序使用它来保存客户机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协议被提出,它实现了浏览器与服务器的全双工通信,扩展了浏览器与服务端的通信功能,使服务端也能主动向客户端