Erlang聊天程序后端(一)

来源:互联网 发布:apache日志文件在哪 编辑:程序博客网 时间:2024/05/07 15:01

Day1

11月3号晚上,HR已经把测试题目发到我QQ了。我浏览了一下题目,就开始学习Erlang。随着测试题目发过来的那本《Erlang并发编程指南》,翻了两页就看不下去了,感觉没头没尾的,而且翻译的句子比较别扭。

于是Google一下,阅读了一遍简单的Erlang tutorial,基本上认识了Erlang的基础语法,Erlang Shell的使用以及各种基本的语法单元: variable, adom, tuple, list ,record, funs等等。

 

Day2

11月4号,阅读JoeArmstrong的ProgrammingErlang,从中开始接触concurrentprogramming的概念,大概是由spawn,receive,!等等元素组成。

读到第十一章IRC-Lite,作者实现了一个聊天程序,貌似可以满足测试题目的要求,兴奋之余,赶紧编译一下,结果失败了。接着尝试弄懂源代码,似乎过于复杂了。作者自己实现了一个module,把一些细节都封装好了,结果我还是被弄糊涂了。

 

Day3

       11月5号,我开始到网上搜索一些例子程序,大都是挺庞大的,尝试着编译,都失败了,也无法解决编译出来的错误;心里也着急,代码也过于庞大而看不下去了;一阵沮丧,担心自己无法实现了。

       静下心来,继续查阅相关的书籍,像Concurrent Programming in Erlang, Learn some Erlang for Great Good等等,里面有提到如何编写Erlang项目,如何布局.erl,.beam等等文件,以及相关的配置的文件。于是开始摸索着写一个项目。

       可是心里烦躁,写不下去了。这是看看自己踩车去西藏拉萨的视频,其中有一个画面,有的车友想要抄小路上山,结果卡在半山腰上不去的画面,顿时觉得自己现在就像是在抄近路,一阵惭愧了。

       下午,醒来后,决心认真看代码,模仿Programming Erlang中的例子程序,一步一步实现自己想要的功能。刚刚写出了一个小功能,可以发送一条消息给Pid,然后将这条消息打印出来,顿时高兴了一阵阵。这时朋友来大学城参加宣讲会,要我去带路,我……

       晚上回来继续写,简单地实现了通过rpc来让对方输出一条信息的功能,本以为好了,有点眉目了。但是测试的时候遇到一些不解的情况:有时候可以从一个shell发送到另一个shell,但是不能从另一个shell发送回来,说rpc什么什么错误;若是某一个shell重启一下,结果两边都不能发送了,如下:


Figure1:test1的结果

测试了半天,问题仍未解决,一怒之下放弃了这个方案了。由于有使用其他编程语言来实现socket编程以及简单的练习,我终于开始从socket里面找解决方法。之前没有这么做,主要是看到HR发过来的那本书没有讲到socket这一章,以为不用socket也可以实现的。

很快,找到一个网友实现的例子(意念-清净【http://hi.baidu.com/diy6688/item/3225ae1ea190a90f8ebde497】),实现的结果非常理想,如下:


Figure2:test2的结果

       当然,这仅仅是个开始,我要查找相关的socket编程的细节了。其中Learn You Some Erlang for Great good一书详细地讲解了udp socket, tcp socket,读了这一章,我就可以很容易地起几个shell来通讯了。

       接着回去仔细研究应用的代码,觉得里面挺复杂的,我画了个图来表明其中的细节:


Figure3:server socket的机制

       说明一些,主要是一个初始的进程1来监听端口,进行连接;进程1还叫了进程2来管理socket队列以及发送信息给所有socket;每次来了一个socket,进行连接后再启动一个进程来处理该socket可能接受的信息,若是接受到数据,让进程2广播给所有的socket;若是退出连接,进程2就把它从socket列表中删除,并结束连接。

原创粉丝点击