[dika 记录] cowboy 扩展socket 协议, 以解决flash ,erlang通讯的沙箱为例子

mochiweb源码阅读2-连接处理 阅读详情


cowboy 的 acceptor pool是通用的,而且说实话,acceptor pool的写法都那样,学习是可以的,但是没必要重复造轮子了.


记录一下 直接使用cowboy做底层socket设施:

把cowboy的依赖打上,我是用rebar的,deps上加上cowboy的git,   可以直接下载源码,放到自己项目中.


要使用很简单,启动cowboy listener 并指定 要回调的协议处理模块.

我就分了两个文件,dp_socket_service.erl   dp_proto_handler.erl    .

开始先介绍比较通用部分的写法,后面再加入flash沙箱策略文件的socket例子


dp_socket_service.erl 使用了gen_server ,目的只是启动了,cowboy listener


这里没有什么特别,下面开始写协议处理模块.


init([]) ->
     cowboy:start_listener(dp_listener, 100,
              cowboy_tcp_transport, [{port,88}],
              dp_proto_handler,[]
             ).

cowboy 有定义了behaviour   

-module(cowboy_protocol).

-export([behaviour_info/1]).

%% @private
-spec behaviour_info(_)->undefined | [{start_link, 4}, ...].
behaviour_info(callbacks) ->
    [{start_link, 4}];
behaviour_info(_Other) ->
    undefined.



可见,要暴露的start_link/4的接口即可, 而四个参数是什么?  最简单办法就是打开cowboy_http_protocol.erl看看


%% @doc Start an HTTP protocol process.
-spec start_link(pid(), inet:socket(), module(), any()) ->{ok, pid()}.

start_link(ListenerPid, Socket, Transport, Opts) ->

这样很清晰了.可以动手了

dp_proto_handler.erl

-spec start_link(pid(), ssl:sslsocket(), module(), []) ->;{ok, pid()}.
start_link(_ListenerPid, Socket, Transport, []) ->;
    Pid = spawn_link(?MODULE, init, [Socket, Transport]),
    {ok, Pid}.



init(Socket, Transport) ->
    recv(#state{socket=Socket, transport=Transport}),
    ok.

把一些我不需要的参数忽略了.开了个进程来处理

recv就是负责处理包的,下面写法有两种了.

一,调用Transport的方法,其实就是调用gen_tcp

二,用receive 原语

-------------------------------------------------以flash 沙箱策略文件为例子--------------------------------------------------------

先定义了这次的请求把,

-define(FLASH_REQ, <<"<policy-file-request/>\0">>).   %%这里记得是后面 \0补全阿
-define(FLASH_FILE, <<"<cross-domain-policy><allow-access-from domain='*' to-ports='*' /></cross-domain-policy>">>).



第一种,直接调用Transport的方法收包发包.

recv(#state{socket=Socket, transport=Transport})->
 case Transport:recv(Socket, 0, 5000) of
    {ok, ?FLASH_REQ}->Transport:send(Socket,?FLASH_FILE),terminate();
    {ok,Other}-> ok;
    {error, _Reason} -> terminate()
    end.


第二种,receive原句

recv(#state{socket=Socket, transport=Transport})->

    Transport:setopts(Socket, [{active, once}]),

    receive

          {ok, ?FLASH_REQ}->Transport:send(Socket,?FLASH_FILE),terminate();
          {ok,Other}-> ok;
          {error, _Reason} -> terminate()
    end.



总结,用法跟直接用tcp都差不多.


by dp~~


开源Cowboy.Sockets建立高性能网络服务器 原生的Sockets我们已经写了很多,大家都知道定义一套完整的Socket通讯服务器和客户端以及网络通讯协议是一件很麻烦的事情,而Cowboy.Sockets原理上也是使用Socket通讯为基础,帮助我们已经搭建好了通讯的服务器和客户端,省去我们自己搭建的过程,想必这对于很多新手来说无异于是福音。同时网络通讯中所使用的数据协议Cowboy.Sockets也帮我们制定好了一个框架,这对于我们后面的开发提供了便利。 立即下载

相关推荐

cowboy实现websocket

使用cowboy实现websocket主要实现以下回调函数 下面的函数返回值要具体弄清楚原因参考 websocket具体协议 主要就是两个部分 握手和数据传输   -export([init/3]).常见所有处理程序回调。建立WebSocket连接,这个函数必须返回upgrade的元组。   -export([websocket_init/3]).初始socket状态,也可以用于注册...

weixin_30553777的博客 586

【亲测免费】 开源项目 Cowboy 使用教程

开源项目 Cowboy 使用教程 项目介绍 Cowboy 是一个开源项目,旨在提供一个高效、灵活的网络通信框架。该项目由 gaochundong 开发,主要用于构建高性能的网络应用程序。Cowboy 支持多种网络协议,包括 TCP、UDP 和 WebSocket,适用于各种网络通信需求。 项目快速启动 环境准备 在开始之前,请确保您的开发环境已经安装了以下工具和库: .NET SDK Visua...

gitblog_00344的博客 465

开源Cowboy.Sockets服务端搭建

上一章,我们简单的介绍了一下Cowboy.Sockets的源码结构。这里我们主要来看一下如果使用Cowboy.Sockets提供的源码建立一个通讯服务器。我们需要先准备一个TCP服务器的配置,只需要简单的new一下就好了。没什么特别的,源码中已经为大家准备好了一些默认配置,包含发送和接收数据的缓冲区大小,是否保持长连接,以及超时计算等等。(想要搞追其细节的同学可以F12进去看一下) var _co...

对信仰的忠诚丶 1298

cowboy源码分析

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33709609的博客 379

CowBoy.Sockets的源码介绍,及搭建一个简单的网络服务器的过程,详细附源码

我们在工作中肯定会遇到网络通信方便的软件需要维护和开发,不管是C++,C#,java中原生的Socket我们可以写过。我们都知道定义一套完整的Socket通讯服务端和客户端以及网络通讯协议是一件很麻烦的事情,而今天要介绍的Cowboy.Sockets开源框架帮助我们搭建好了通讯的服务端和客户端,同时网络通讯中所使用的数据协议Cowboy.Sockets也帮我们制定好了一个框架,方便了我们后续开发...

Zy100Papa的博客 1336

Erlang cowboy websocket 服务器

Erlang可以用来实现一个websocket服务器。cowboy这样框架可以完成这个任务,是我们不必关注websocket协议的细节。

1万+

erlang 网络编程学习】 分析cowboy acceptor实现

不知道为什么就看了cowboy代码,就继续看了下去了。 分析一下吧,主要写写cowboy 的acceptor pool 的实现 cowboy的源码比mochiweb的更简洁, acceptor pool是通用的,cowboy提供了tcp的协议实现。而应用层协议也是通用的,cowboy提供了http协议的实现。 一、循例分析一下

dp studio 5315

开源Cowboy.Sockets客户端搭建

客户端的搭建方式和服务端基本差不多,这里就不做详细讲解,直接上代码。            和服务端一致,我们需要创建一个配置实例,表示我们的缓冲区大小等配置。             var _config = new TcpSocketClientConfiguration();            这里我们需要指定我们将要连接到哪一个地址的哪一个端口。            IPEndPo...

对信仰的忠诚丶 1214

关于Erlang Socket的三种消息接收模式

转载请注明,来自:http://blog.csdn.net/skyman_2001 erlangsocket有3种消息接收模式:active、passive和active once,可以在gen_tcp:connect/3或gen_tcp:listen/2里设置{active, true | false |once}来实现,也可以用inet:setopts/2来动态设置。这3种模式的区别是:

Skyman的部落格 3584

erlangsocket知识点

Erlang Socket a. 最核心的概念 - socket控制进程 b. 基本的C/S结构的例子(服务器只能处理一个客户端连接) c. 顺序型服务器的例子(服务器顺序的处理客户端的请求,每次只能处理一个,处理完一个处 理下一个) d. 并发型服务器的例子(服务器并发的处理多个客户端的请求) e. 控制逻辑 - 主动型消息接收(非阻塞) f. 控制逻辑 - 被动型消息接收(

wangyangkobe的专栏 3203

cowboy源码分析(二)

cowboy源码分析(一) 下面我们重点看看cowboy_protocol.erl代码 -module(cowboy_protocol). %% API. -export([start_link/4]). %% Internal. -export([init/4]). -export([parse_request/3]). -export([resu...

weixin_30480075的博客 187

erlang ut8处理的一个小技巧

EShell是按照UTF-8编码读取的代码,而Erlang编译器是按照ISO-latin-1(ISO-8859-1)编码进行代码解析的, 所以在代码中打印数据有时会看到  "e"  "&"等奇怪的字符 解决方法,R16B01可在erl文件最前面加上一行 %% coding: utf-8 不要看它是注释格式。。它依然会生效。。。

taitoubiyan1的专栏 704

erlang节点间通信使用erlang send 和使用gen_tcp socket性能的对比(

erlang开发中使用erlang send是比较方便的,但是性能相比使用socket会有多大的损失呢。   测试程序:     客户端:         1.使用erlang send  发送1M次数据,每次一个整数         2.使用gen_tcp连接,发送1M次数据,每次一个整数     服务器端:         基于ranch socket框架,开发简单的socke

Sunface撩技术 2890

Erlang cowboy 处理简单的HTTP请求

Handling plain HTTP requestsThe simplest way to handle a request is by writing a plain HTTP handler. It is modeled after Erlang/OTP's gen_server behaviour, although simplified, as Cowboy will simply c

4217

flash 连接 erlang

-module(server_flash). -export([policy_file_server/0, policy_file_server_proc/1]). %%------------------------------------------------------------------------------ %% Flash Policy File Server

saydo 521

Erlang通过WebSocket和浏览器交互

本文是用Erlang通过WebSocket协议实现的一个简单的服务器端的double计算器,Erlang下面有成熟的Web框架Cowboy,但本着了解原理的心态没有用这个框架,代码如下:<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <ti

JOM_CH 4361
上一篇: [dika记录] 游戏地图模块 的初步模型
下一篇: [c语言 ] 用libev 写个echo服务器
拿小xi的铅笔
博客等级 码龄15年 37粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值