cowboy实现websocket
.然后和WebSocket握手。-module(websocket_app). -behaviour(application). %% Application callbacks
-export([start/, stop/]). %% ===================================================================
%% Application callbacks
%% =================================================================== start(_StartType, _StartArgs) ->
%%启动存储pid的树据 可以采用 ets 表格处理 但是为了方便集群处理 我采用的mnesia
ok = websocket_store:init(),
%% 配置路由
Dispatch = cowboy_router:compile([
{'_', [
{"/", cowboy_static, {priv_file, websocket, "index.html"}},
{"/websocket", websocket_hander, []},
{"/static/[...]", cowboy_static, {priv_dir, websocket, "static"}}
]}
]),
{ok, _} = cowboy:start_http(http, , [{port, }],
[{env, [{dispatch, Dispatch}]}]),
%%启动监督树
websocket_sup:start_link(). stop(_State) ->
ok.
-module(websocket_sup). -behaviour(supervisor). %% API
-export([start_link/]). %% Supervisor callbacks
-export([init/]). %% Helper macro for declaring children of supervisor
-define(CHILD(I, Type), {I, {I, start_link, []}, permanent, , Type, [I]}). %% ===================================================================
%% API functions
%% =================================================================== start_link() ->
supervisor:start_link({local, ?MODULE}, ?MODULE, []). %% ===================================================================
%% Supervisor callbacks
%% =================================================================== init([]) ->
Children = [],
{ok, { {one_for_one, , }, Children} }.
-module(websocket_hander). -behaviour(cowboy_websocket_handler). %% ------------------------------------------------------------------
%% API Function Exports
%% ------------------------------------------------------------------ %% ------------------------------------------------------------------
%% gen_server Function Exports
%% ------------------------------------------------------------------ -export([init/]).
-export([websocket_init/]).
-export([websocket_handle/]).
-export([websocket_info/]).
-export([websocket_terminate/]). %% ------------------------------------------------------------------
%% API Function Definitions
%% ------------------------------------------------------------------ %% ------------------------------------------------------------------
%% gen_server Function Definitions
%% ------------------------------------------------------------------ %%websocket 握手
init({tcp, http}, _Req, _Opts) ->
%%插入数据
websocket_store:dirty_insert(self(),web),
{upgrade, protocol, cowboy_websocket}.
%%连接初始
websocket_init(_TransportName, Req, _Opts) ->
%%连接一秒后 发送消息
erlang:start_timer(, self(), <<"Hello!">>),
{ok, Req, undefined_state}.
%%处理客户端发送投递的消息
websocket_handle({text, Msg}, Req, State) ->
%% 把消息投递到其余的进程 这里可以 投递到 tcp socket 也可以投递的 websocket 这样就可以实现 服务支持多协议处理
lists:foreach(fun([Pid,SocketType]) ->
case SocketType of
tcp -> ok;
web ->
case Pid == self() of
true -> ok;
false -> Pid!{chat,Msg}
end
end
end,websocket_store:dirty_lookall()),
{reply, {text, << "That's what she said! ", Msg/binary >>}, Req, State};
websocket_handle(_Data, Req, State) ->
{ok, Req, State}.
%% 处理erlang 发送的消息 这里是接收 行发送的数据
websocket_info({chat,Msg},_Req,State)->
{reply,{text,Msg},_Req,State};
%% 处理 erlang:start_timer(, self(), <<"Hello!">>) 发送的消息
websocket_info({timeout, _Ref, Msg}, Req, State) ->
{reply, {text, Msg}, Req, State}; websocket_info(_Info, Req, State) ->
{ok, Req, State}.
%%断开socket
websocket_terminate(_Reason, _Req, _State) ->
websocket_store:dirty_delete(self()),
ok. %% ------------------------------------------------------------------
%% Internal Function Definitions
%% ------------------------------------------------------------------
%%%-------------------------------------------------------------------
%%% @author thinkpad <>
%%% @copyright (C) , thinkpad
%%% @doc
%%%
%%% @end
%%% Created : Jun by thinkpad <>
%%%-------------------------------------------------------------------
-module(websocket_store). -include_lib("stdlib/include/qlc.hrl" ).
%% API
-export([dirty_insert/,dirty_lookall/,dirty_lookall_record/,dirty_delete/]). -export([init/,insert/,delete/,lookup/,lookall/]). -record(socket_to_pid, {pid,socket_type}). -define(WAIT_FOR_TABLES, ). %%%===================================================================
%%% API
%%%===================================================================
init()->
dynamic_db_init(). %--------------------------------------------------------------------
%% @doc Insert a key and pid.
%% @spec insert(Key, Pid) -> void()
%% @end
%%--------------------------------------------------------------------
insert(Pid,SocketType) when is_pid(Pid) ->
Fun = fun() -> mnesia:write(#socket_to_pid{pid = Pid, socket_type = SocketType}) end,
{atomic, _} = mnesia:transaction(Fun). %--------------------------------------------------------------------
%% @doc dirty insert pid and socket
%% @spec dirty_insert(Pid socket)
%% @end
%%-------------------------------------------------------------------- dirty_insert(Pid,SocketType) when is_pid(Pid) ->
mnesia:dirty_write(#socket_to_pid{pid = Pid, socket_type = SocketType}).
%--------------------------------------------------------------------
%% @doc dirty_read data
%% @spec dirty_lookall()
%% @end
%%-------------------------------------------------------------------- dirty_lookall()->
mnesia:dirty_select(socket_to_pid,[{#socket_to_pid{pid='$1',socket_type = '$2'},[],['$$']}]). dirty_delete(Pid)->
mnesia:dirty_delete(socket_to_pid,Pid). %--------------------------------------------------------------------
%% @doc look all record info
%% @spec
%% @end
%%-------------------------------------------------------------------- dirty_lookall_record()->
mnesia:dirty_select(socket_to_pid,[{#socket_to_pid{pid='$1',socket_type = '$2'},[],['$_']}]).
%%--------------------------------------------------------------------
%% @doc Find a pid given a key.
%% @spec lookup(Key) -> {ok, Pid} | {error, not_found}
%% @end
%%--------------------------------------------------------------------
lookup(Pid) ->
do(qlc:q([{X#socket_to_pid.pid,X#socket_to_pid.socket_type} || X <- mnesia:table(socket_to_pid),X#socket_to_pid.pid==Pid])). %%--------------------------------------------------------------------
%% @doc Find all list
%% @spec lookall() -> {List} | {error, not_found}
%% @end
%%--------------------------------------------------------------------
lookall() ->
do(qlc:q([[X#socket_to_pid.pid,X#socket_to_pid.socket_type] || X <- mnesia:table(socket_to_pid)])). %%--------------------------------------------------------------------
%% @doc Delete an element by pid from the registrar.
%% @spec delete(Pid) -> void()
%% @end
%%--------------------------------------------------------------------
delete(Pid) ->
try
[#socket_to_pid{} = Record] = mnesia:dirty_read(socket_to_pid, Pid, #socket_to_pid.pid),
mnesia:dirty_delete_object(Record)
catch
_C:_E -> ok
end. %%--------------------------------------------------------------------
%% @doc
%% @spec
%% @end
%%-------------------------------------------------------------------- %%%===================================================================
%%% Internal functions
%%%===================================================================
dynamic_db_init() ->
delete_schema(),
{atomic, ok} = mnesia:create_table(socket_to_pid, [{attributes, record_info(fields, socket_to_pid)}]),
ok. %% deletes a local schema.
delete_schema() ->
mnesia:stop(),
mnesia:delete_schema([node()]),
mnesia:start(). do(Query) ->
F = fun() -> qlc:e(Query) end,
{atomic, Value} = mnesia:transaction(F),
Value.

cowboy实现websocket的更多相关文章
- Cowboy 开源 WebSocket 网络库
		
Cowboy.WebSockets 是一个托管在 GitHub 上的基于 .NET/C# 实现的开源 WebSocket 网络库,其完整的实现了 RFC 6455 (The WebSocket Pro ...
 - 【转】Cowboy 开源 WebSocket 网络库
		
原文链接: http://www.cnblogs.com/gaochundong/p/cowboy_websockets.html
 - [Erlang33]使用recon从网页查看Erlang运行状态
		
0.需求分析 Erlang最好的卖点之一就是提供了一个非常强大的shell来查看Node运行时的各种状态,可以进行各种各样的内部查看,在运行时调试和分析,热更新代码. 但是总有一些在生产环境下要慎 ...
 - Erlang cowboy websocket 服务器
		
Erlang cowboy websocket 服务器 原文见于: http://marcelog.github.io/articles/erlang_websocket_server_cowboy_ ...
 - Cowboy http服务器 websocket
		
一.基础介绍 cowboy是一个小巧.快速.模块化的http服务器,采用Erlang开发.其中良好的clean module使得我们可以扩展到多种网络协议之中,cowboy自带的有tcp和ssl,而也 ...
 - [翻译][erlang]cowboy handler模块的使用
		
关于Cowboy Cowboy是基于Erlang实现的一个轻量级.快速.模块化的http web服务器. Handlers,用于处理HTTP请求的程序处理模块. Plain HTTP Handlers ...
 - Erlang cowboy 入门参考之现代Web的发展历史
		
Erlang cowboy 入门参考之现代Web发展史 原文: http://ninenines.eu/docs/en/cowboy/1.0/guide/modern_web/ 让我回顾一下web技术 ...
 - Erlang cowboy 入门参考
		
Erlang cowboy 入门参考 cheungmine,2014-10-28 本文翻译自: http://ninenines.eu/docs/en/cowboy/HEAD/guide/gettin ...
 - 带ssl的websocket例子
		
还是在那个websocket_demo的例子 rebar-creator create-app websocket_demo tree一下看看大概目录 ├── cert │ ├── cowboy- ...
 
随机推荐
- Loadrunder场景设计篇——定时器(schedule)
			
A. 定义方案schedule 在 Scenario Schedule面板中,选择一个方案schedule,或通过点击New Schedule定义一个新的方案 定义schedule: a.新建sc ...
 - hadoop07---synchronized,lock
			
synchronized 锁是jvm控制的,控制锁住的代码块只能有一个线程进入.线程执行完了锁自动释放,抛出异常jvm会释放锁. synchronized的缺陷 1.如果一个线程被阻塞了,其余的线程 ...
 - SQL char   Nvarchar 详解
			
Nvarchar : 可变长度的 , Unicode 编码. 长度 1-4000, 1个汉子 或者 字符 都是 2个字节. 支持多语言, 配合 大写 N 可以防止出现乱码. char: 固定 ...
 - 20145219 《Java程序设计》第06周学习总结
			
20145219 <Java程序设计>第06周学习总结 教材学习内容总结 InputStream与OutputStream 串流设计 1.串流:Java将输入/输出抽象化为串流,数据有来源 ...
 - 20145109 《Java程序设计》第三周学习总结
			
20145109 <Java程序设计>第三周学习总结 教材学习内容总结 Chapter 4 Object 4.1 Class & Object definition of clas ...
 - 为JAXB和response设置编码,解决wechat4j中文乱码
			
如果有哪一个做程序员的小伙伴说自己没有遇到中文乱码问题,我是不愿意相信的.今天在做微信订阅号的智能回复时,又一时迷乱的跳进了中文乱码这个火坑.刚解决问题时,都欢呼雀跃了,完全忘记了她曾经带给我的痛苦. ...
 - 关于jquery的each遍历,return只终止当前循环,不好使的解决办法
			
很奇怪,一般来说return会终止js,但是今天万万没想到的是,jquery 的each循环中,return不好使,做一记录, var result = true; $('input[type=&qu ...
 - Difference between RouteTable.Routes and HttpConfiguration.Routes?
			
https://stackoverflow.com/questions/12533782/difference-between-routetable-routes-and-httpconfigurat ...
 - nagios无法载入静态资源
			
使用nginx+nagios无法载入静态资源,看了下url中增加了一个/nagios 查看是/usr/local/nagios/etc/cgi.conf中url_html_path=/nagios 将 ...
 - c++ learning
			
迟到了三年的学习笔记.. 野指针:造了一个指针,不是NULL或者没有指向正经内存.比如刚造出来又不赋值,并不知道它指向了哪里 内存泄漏:造了一个指针,给他分配了空间,xxxxx,又分配了一块空间,指针 ...