`

[练习]erlang编程练习3:echo程序实现

 
阅读更多

这段程序一些地方参考:

写道
http://www.erlang.org/upload/klacke_examples/chargen.erl

依旧是erlang官网的一个example

 

自己独立写的时候 做了一个同步的版本 接下去改成异步

改成异步的时候没有把gen_tcp:listener那段独立到循环的进程中去

调用函数那段就运行完了(那么tcp的端口就相当于直接关闭了)

苦恼不已 后来按照以上程序在一些地方改了改 加上了 关闭 的操作

通过进程链接来关闭已经在服务的进程(就是一层的监督结构)

 

这边记点笔记,说说一些API调用之类的

 

代码如下:

 

-module(server).
-export([start/0,start/1,loop_accept/2,listener/1]).
-define(DEAFULT_PORT,1236).

start() ->
 start(?DEAFULT_PORT).

start(Port) ->
  spawn_link(?MODULE,listener,[Port]).

listener(Port) ->
 case gen_tcp:listen(Port,[{active,false}]) of
   {ok,LSocket}-> process_flag(trap_exit,true),
                  spawn_link(?MODULE,loop_accept,[LSocket,self()]),
                  loop(LSocket);   
         Other -> Other 
  end.

loop(LSocket) ->
  receive
    continue ->
      	spawn_link(?MODULE,loop_accept,[LSocket,self()]),
		loop(LSocket);
    {stop,Reason} ->
	    exit(Reason);
    stop ->
	    exit(shutdown);
	Other ->
	    io:format("link process exit:~p~n",[Other]),
		loop(LSocket)
  end.
    
loop_accept(Ls,Pid) -> 
  io:format("accept now~n"),
     case gen_tcp:accept(Ls) of
       {error, Reason} -> Pid ! {stop,Reason};
	   {ok,Socket} -> Pid ! continue,worker(Socket) end.

	   
worker(Socket) ->
    %%io:format("work now~n"),
	case gen_tcp:recv(Socket, 0) of
	   {ok, Packet} ->
	     gen_tcp:send(Socket,Packet),worker(Socket);
	   {error, Reason} ->
	     %%io:format("Socket ~w closed [~w]~w",[Socket,self(),Reason]),
		 exit(Reason)
    end.
		 

 

代码的基本流程很简单:

  1. server:start/0/1启动应用
  2. 产生并连接进程sub(监督者进程 同时用来监视进行echo的进程的情况)
  3. sub用来启动监听的进程acc(该进程一启动就会监听 有连接进来给work处理)
  4. sub接受到退出信息(stop)后就退出并发送shutdown信息 其他的acc进程也跟着退出

 

代码说明:

listen时使用了active,false的参数 说明所有进来的信息要通过gen_tcp:recv/2才能获取到(而 active,true或者 active,once则会直接把信息传送给进程 区别是后者只传送一次(所以在接受时要通过inet:setopts/2不断重置为{active,once})

此外设置成 active,false 接受的消息要么是{ok,内容} 要么是{error,Reason}

而其他两种收到的形式是  {tcp,S,Data} {tcp_closed,S}(那个S就是通信用的Socket) 

 

附带一张 链接时退出信号传播时的对应表现:

捕获状态              退出信号(原因)            动作  
       true                     kill                      消亡,向链接的进程广播退出信号(killed)
       true                     X                        将{'EXIT', Pid, X} 加入到邮箱
       false                    normal               不做任何事
       false                    kill                       消亡,向链接的进程广播退出信号(killed)
       false                    X                         消亡,向链接的进程广播退出信号X
该表来源:http://www.cnblogs.com/fangjie008/archive/2012/08/28/2660361.html
捕获指的是process_flag(trap_exit,true).
分享到:
评论

相关推荐

    Erlang编程

    Erlang的设计哲学是创建简单、可扩展、容错的程序,其语法规则相对简单明了,非常适合并行编程和分布式计算。 #### 书籍推荐 《Erlang编程:软件为并发世界而设计》是Joe Armstrong所著的入门级Erlang书籍。作者在...

    图书:Erlang编程

    《Erlang编程》是一本深入探讨Erlang语言的图书,主要面向对并发处理、分布式系统和高可用性有需求的开发者。Erlang是一种为构建大规模并发系统而设计的函数式编程语言,它源自爱立信,以其在电信行业的成功应用而...

    Erlang编程指南

    “即便我已经使用Erlang多年,在编程的时候仍然需要参考《Erlang编程指南》。不同层次的Erlang程序员都会发现本书是有价值的学习和参考资料..., 《Erlang编程指南》每章末尾都提供了练习题,并且由简单的示例贯穿全书。

    Erlang编程规则——中文翻译版本

    本文将对Erlang编程规则的中文翻译版本中的部分内容进行详细解析,包括Erlang术语、SW工程原则、程序、服务器和消息处理、Erlang特殊约定、常见错误以及所需文档约定等。 Erlang术语部分提到了Erlang程序的模块化...

    Erlang并发编程,Erlang程序设计,Erlang中文手册

    Erlang并发编程,Erlang程序设计,Erlang中文手册。 学习erlang的好资料。  Erlang是一个结构化,动态类型编程语言,内建并行计算支持。最初是由爱立信专门为通信应用设计的,比如控制交换机或者变换协议等,因此...

    Erlang程序设计(中文版-完整书签)&Erlang编程指南(中英文版)

    Erlang程序设计(中文版-完整书签)&Erlang编程指南(中英文版)

    erlang编程 Introducing Erlang

    Erlang基于函数式编程范式,这意味着程序由纯函数构成,没有副作用。函数式编程强调数据不可变性和函数的数学属性,使代码更易于理解、测试和并行处理。 ### 2. 并发与轻量级进程 Erlang的一大亮点是其内置的并发...

    Erlang程序设计,包含完整目录和全套源码

    这个压缩包包含了Erlang程序设计的完整目录和源码,是学习和理解Erlang编程的重要资源。 Erlang的并发特性源于其轻量级进程模型,每个进程都有自己的内存空间,进程间通信通过消息传递实现,这种设计降低了并发执行...

    仿知乎java源码-py_interface:Erlang到Python的集成:Python程序可以显示为Erlang节点

    【标题】中的“仿知乎java源码-py_interface:Erlang到Python的集成”表明这是一个关于Java编程的项目,其核心功能是实现Erlang与Python之间的交互。Erlang是一种面向并发、分布式计算的语言,常用于构建高可用性和...

    Erlang(32,64)安装程序

    Erlang(['ə:læŋ])是一种通用的面向并发的编程语言,它由瑞典电信设备制造商爱立信所辖的CS-Lab开发,目的是创造一种可以应对大规模并发活动的编程语言和运行环境。Erlang问世于1987年,经过十年的发展,于1998年...

    erlang压缩包.rar

    你可以开始使用Erlang编程,或者与其他Erlang应用程序(如 RabbitMQ 或 Phoenix 框架)集成。 Erlang的语法简洁而独特,主要基于函数式编程理念。其数据类型包括原子(atom)、整数、浮点数、字符串、列表和二进制...

    erlang入门级练习:LeetCode OJ问题的部分erlang 源码

    我自己在新学erlang,在LeetCode OJ上找了题目练习,题目很适合新手熟悉语言,但是LeetCode OJ里面只有几门主流语言的答案,下面是已完成的erlang源代码,后续有空再做其他问题续传,题目包含:(源码开头都有题目...

    erlang编程指南

    erlang编程语言圣经 erlang从业人员的必备书籍 erlang语言开发入门

    erlang 24.0 龙芯 loongarch64 预编译版本

    Erlang是一种强大的并发编程语言,特别适合于构建高可用性、分布式系统,尤其是在电信、银行和互联网领域广泛应用。在给定的标题“erlang 24.0 龙芯 loongarch64 预编译版本”中,我们可以看到这个软件包是为龙芯...

    Erlang游戏程序学习完整PDF手册

    这份"Erlang游戏程序学习完整PDF手册"是一份全面介绍Erlang在游戏开发中应用的学习资料,包含了Erlang的基础知识、并发原理以及在游戏开发中的实践案例。 Erlang语言的设计理念源自于Ericsson公司为解决电信系统中...

    Erlang程序设计(第2版)1

    【Erlang程序设计(第2版)】是由Erlang之父Joe Armstrong撰写的一本经典著作,专注于介绍Erlang编程语言在并发、分布式和容错系统中的应用。本书适用于初学者和有一定经验的Erlang程序员。作者在书中讨论了如何利用...

    并行编程语言Erlang:Erlang OTP框架及其应用开发指南

    内容概要:本文档详细介绍了Erlang编程语言及其并行编程模型,并重点阐述了Erlang OTP框架的特性和应用场景。首先,文档简述了Erlang语言的特点,包括轻量级进程、模式匹配和热代码升级等特性,以及它在构建高可用、...

    Erlang入门:构建application练习4(进程link的作用)

    在Erlang编程语言中,进程是其核心特性之一,它们是并发执行的实体,类似于其他语言中的线程。在Erlang中,进程间通信(IPC)是通过消息传递来实现的,而`link`机制是这个通信模型中非常重要的一部分。本教程将通过...

Global site tag (gtag.js) - Google Analytics