首页 > 代码库 > 带ssl的websocket例子
带ssl的websocket例子
还是在那个websocket_demo的例子
rebar-creator create-app websocket_demo
tree一下看看大概目录
├── cert│ ├── cowboy-ca.crt│ ├── server.crt│ └── server.key├── src│ ├── path_helper.erl│ ├── route_helper.erl│ ├── websocket_demo.app.src│ ├── websocket_demo_app.erl│ └── ws_handler.erl├── static│ ├── index.html│ └── js│ └── jquery.min.js
cert目录从cowboy的sample里面的拿过来即可,ca证书需要全部信任,浏览器得重启,具体google看看
static目录随便弄点过来显示下https即可,这个用来测试整数有没有问题的
直接贴代码
path_helper.erl
-module(path_helper).-export([get_path/1]).get_path(ExtraPath)-> {ok,CurrentPath} = file:get_cwd(), Path = string:concat(CurrentPath,"/"), string:concat(Path,ExtraPath).
route_helper.erl
-module(route_helper).-export([get_routes/0]).get_routes() -> StaticPath = path_helper:get_path("../static/"), [ {‘_‘, [ {"/websocket", ws_handler, []}, {"/static/[...]", cowboy_static, {dir, StaticPath}} ]} ].
websocket_demo_app.erl
-module(websocket_demo_app).-behaviour(application).-export([start/2, stop/1]).start(_Type, _Args) -> ok = application:start(crypto), ok = application:start(cowlib), ok = application:start(ranch), ok = application:start(cowboy), CertDir = path_helper:get_path("../cert/"), io:format("~p~n",[CertDir]), Routes = route_helper:get_routes(), Dispatch = cowboy_router:compile(Routes), Port = 8080, TransOpts = [ {port, Port}, {cacertfile, CertDir ++ "/cowboy-ca.crt"}, {certfile, CertDir ++ "/server.crt"}, {keyfile, CertDir ++ "/server.key"} ], ProtoOpts = [{env, [{dispatch, Dispatch}]}], {ok, _} = cowboy:start_https(https,100, TransOpts, ProtoOpts).stop(_State) -> ok.
ws_handler.erl
-module(ws_handler).-behaviour(cowboy_websocket_handler).-export([init/3]).-export([websocket_init/3]).-export([websocket_handle/3]).-export([websocket_info/3]).-export([websocket_terminate/3]).init({tcp, http}, _Req, _Opts) -> io:format("init ~n"), {upgrade, protocol, cowboy_websocket};init({ssl, http}, _Req, _Opts) -> io:format("ssl init ~n"), {upgrade, protocol, cowboy_websocket}.websocket_init(_TransportName, Req, _Opts) -> io:format("websocket_init ~n"), erlang:start_timer(1000, self(), <<"Hello!">>), {ok, Req, undefined_state}.websocket_handle({text, Msg}, Req, State) ->%% io:format("websocket_handle text ~p,~p,~p~n",[Msg,Req,State]), {reply, {text, << "That‘s what she said! ", Msg/binary >>}, Req, State};websocket_handle(_Data, Req, State) ->%% io:format("websocket_handle ~p,~p,~p~n",[_Data,Req,State]), {ok, Req, State}.websocket_info({timeout, _Ref, Msg}, Req, State) -> %io:format("websocket timeout ~n"), erlang:start_timer(1000, self(), <<"How‘ you doin‘?">>), {reply, {text, Msg}, Req, State};websocket_info(_Info, Req, State) -> io:format("websocket_info ~p,~p,~p~n",[_Info,Req,State]), {ok, Req, State}.websocket_terminate(_Reason, _Req, _State) -> io:format("terminate ~n"), ok.
注意,在ssl的是,init的参数
在线测试http://www.baiyangliu.com/lab/websocket/
本地websocket测试地址
wss://loclahost:8080/websocket
如果提示ssl错误什么的,最好先看看下面这个对不对
https://localhost:8080/static/index.html
注:ssl以后,访问必须以域名,不能ip。
带ssl的websocket例子
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。