博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
erlang之三种socket消息循环
阅读量:6835 次
发布时间:2019-06-26

本文共 1813 字,大约阅读时间需要 6 分钟。

1、主动消息获取(非阻塞)

第一个例子是以主动模式打开socket,然后接受来自socket的数据:

{ok,Listen} = gen_tcp:listen(Port,[...,{active,true}...]),

{ok,Socket} = gen_tcp:accept(Listen), loop(Socket).

loop(Socket) ->

receive

{tcp,Socket,Data} -> ... 输出处理 ...

{tcp_closed,Socket} -> ...

end.

这个过程无法控制发到服务器循环的消息流,如果客户端产生数据的速度大于服务器消费数据的速度,系统就会收到洪水般地消息-消息缓冲区溢出,系统将会crash并表现怪异。

这种类型的服务器叫做非阻塞服务器,因为它无法阻塞客户端。我们仅在信任客户端的情况下才会使用非阻塞服务器。

 

2 被动消息获取(阻塞)

在这一节,我们写阻塞服务器:服务器以被动模式打开socket,通过 {active,false} 选项。这个服务器不会被危险的客户端洪水袭击。

服务器循环中的代码调用 gen_tcp:recv 来接收数据。客户端在服务器调用 recv 之前会被阻塞。注意OS会对客户端发来的数据做一下缓冲,以允许客户端在服务器调用 recv 之前仍然可以继续发送一小段数据。

{ok,Listen} = gen_tcp:listen(Port,[...,{active,false}...]),

{ok,Socket} = gen_tcp:accept(Listen), loop(Socket).

loop(Socket) ->

case gen_tcp:recv(Socket,N) of {ok,B} -> ... 数据处理 ... loop(Socket);

{error,closed} ...

end.

 

3 混合消息获取(部分阻塞)

你可能认为把被动模式用到所有服务器上都合适。不幸的是,当我们在被动模式时,我们只能等待来自于一个socket的数据。这对于需要等待多个socket来源数据的服务器则不适用。

幸运的是我们可以用混合方式,既不是阻塞的也不是非阻塞的。我们以一次主动(active once)模式 {active,once} 打开socket。在这个模式中,socket是主动的,但是只能接收一条消息。在控制进程发出一条消息之后,他必须明确的调用 inet:setopts 以便让socket恢复并接收下一条消息。系统在这发生之前会一直阻塞。这是两种世界的最好结合点。如下是代码:

{ok,Listen} = gen_tcp:listen(Port,[...,{active,once}...]),

{ok,Socket} = gen_tcp:accept(Listen), loop(Socket).

loop(Socket) ->

receive

{tcp,Socket,Data} -> ... 数据处理 ... %%准备好启用下一条消息时

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

loop(Socket);

{tcp_closed,Socket} -> ...

end.

使用 {active,once} 选项,用户可以实现高层次的数据流控制(有时叫交通管制),同时又防止了服务器被过多的消息洪水所淹没。

inet:sockname(Socket) 返回本地地址和端口号 {ok, {Address, Port}}
inet:peername(Socket) 返回连接的另一端 地址和端口 {ok, {Address, Port}}
inet:setopts(Sock, [{active, once}]),我们可以让数据乖乖的听话,主动发给我们一个数据,然后变不主动,我们处理完这个消息后,然后在设置active once,其继续再发给我们一个数据. 这样的好处是,不会因为{active, true},给我们发送了大量的数据,导致我们应接不暇.也不会让我们每次都手动 gen_tcp:recv/2数据,那么累人
eclipse erlang插件已经修改为: 

转载于:https://www.cnblogs.com/huangliang-hb/p/8489865.html

你可能感兴趣的文章
Asp.net Web.Config - 配置元素customErrors
查看>>
Android: how to resolve Application’s parameter NullPointerException
查看>>
EntityFramework用法探索(二)CodeFirst
查看>>
人人都来写算法 之 快速排序
查看>>
[转]SQLServer和Oracle,存储过程区别,常用函数对比
查看>>
如何在ArcMap中监听键盘鼠标事件
查看>>
vs2012中程序集生成无法自动在网站Bin目录下生成Dll文件?(已解决!)
查看>>
fastDFS同步问题讨论
查看>>
ActiveMQ学习笔记(二) JMS与Spring
查看>>
实验室报告:VMware vSphere Data Protection
查看>>
php的数组与字符串的转换函数整理
查看>>
WCF 框架运行时类图
查看>>
spring配置异步执行
查看>>
软件开发报价的计算方法
查看>>
大型网站系统架构分析--转
查看>>
php 文件操作
查看>>
poj 1474 Video Surveillance - 求多边形有没有核
查看>>
c#接口和抽象类对比学习
查看>>
BUZZER Driver
查看>>
软件分发、补丁推送排错
查看>>