`
yjl49
  • 浏览: 112925 次
社区版块
存档分类
最新评论

Erlang 聊天室程序( 一)

阅读更多

为了熟悉Erlang的套接字编程开始编写一个“聊天室”程序。基本流程如下:

1.服务器启动监听指定端口

2.启动一个gen_server 作为聊天室进程,里面使用ets 保持当前所有客户端连接信息,并负责将某个客户端的消息广播到所有在线客户端

3.服务器接受客户端连接,并绑定到一个gen_server进程

4.客户端维护进程接受客户端发送的消息,调用聊天室进程函数进行广播

5.客户端维护进程接受聊天室发送的消息,转发给客户端

 

客户端信息包括id、pid、socket、nickname、sex、age、province 等。

目前包括以下几个模块:

echatServer.erl :服务器端程序启动模块。

chat_room.erl :聊天室模块,一个gen_server负责处理客户端请求,保存了所有客户端的连接信息。

id_generator.erl:负责为每一个连接的客户端生成唯一ID

client_session.erl:与客户端socket绑定的gen_server回调模块,接收和发送消息

chat_acceptor.erl:负责监听端口和处理连接的客户端socket

 

代码如下:

echatServer.erl:

 


chat_room.erl:

 

 

id_generator.erl:

 

 


client_session.erl:

 

 


chat_acceptor.erl:

 

 

 

为了测试这个服务器程序,我用JAVA写了个简单的client端程序,如下:

MainForm.java

 

 

SocketClient.java

 


 


测试方法:

启动服务器端:

>echatServer:start().

启动两个客户端:

run as java Application

效果图:

发送:

发送:

服务器端打印出的日志:

 

 

至此基本的聊天功能实现了。顺便说下,以上的服务器端程序将监听到的socket连接交由单独的进程处理了。

还有不足就是客户端退出时会引发服务器端异常退出,这个需要对socket连接断开进行处理,下一步对这个进行修改。

分享到:
评论
1 楼 ribavnu 2013-04-20  
楼主,你的clientinfo.hrl文件是什么啊?转载的别人的少文件?

相关推荐

    一个我自己学习Erlang的聊天室服务器及客户端代码

    一、Erlang聊天室服务器端 1. 并发处理:Erlang的轻量级进程(processes)是其并发特性的重要体现。在这个聊天室服务器中,每个连接的客户端都会被分配一个独立的进程来处理,这样可以确保每个会话的独立性和并发性...

    erlang server

    这两个压缩包结合使用,就可以构建一个简单的Erlang聊天室系统,用户可以通过客户端连接到服务器,进行实时的文本交流。通过阅读和理解这些代码,开发者可以学习到Erlang的并发编程技巧、网络通信以及如何实现一个...

    erlang server源码

    本文将深入探讨“echatServer”这个Erlang聊天室服务器的源码,解析其核心概念和技术。 1. **进程模型** Erlang中的进程是轻量级的,它们之间通过消息传递进行通信。在echatServer中,每个用户连接可能对应一个...

    nitrogen 聊天室

    综上所述,"nitrogen 聊天室"是一个利用Erlang和Nitrogen框架构建的高效内部沟通工具,其特点是实时通信、文件分享和安全控制,体现了Erlang在构建此类系统时的优势。通过深入理解Erlang和Nitrogen,我们可以定制和...

    Erlang中文手册

    - **示例**: 设计一个简单的聊天室应用,包括客户端和服务器端。 - **功能**: - 客户端可以发送消息到服务器。 - 服务器广播消息给所有在线客户端。 - 支持用户登录和退出。 #### 四、健壮性 **1.4.1 超时 ...

    messager.zip

    多shell环境意味着多个独立运行的Erlang虚拟机(VM),它们之间可以通过发送和接收消息进行通信,模拟聊天室中的用户对话。每个shell可以看作是一个用户,它们在各自的环境中运行着聊天程序实例,通过消息传递进行...

    phoenix_rethinkdb_chat:使用 Phoenix 和 RethinkDB 在 Elixir 中的简单聊天应用程序

    5. **Phoenix Channels**:Phoenix Channels是Phoenix框架中的实时通信组件,它们基于WebSockets,允许在客户端和服务器之间建立多个主题频道,从而实现实时的数据交换,如聊天室中的消息传递。 6. **数据库集成**...

    phoenix_chat:使用Phoenix频道和状态的Elixir聊天应用程序示例

    凤凰聊天室 使用Phoenix频道和状态的示例Elixir聊天应用程序。 跟随伴随的博客文章: 屏幕截图 安装 需要Erlang和Elixir。 $ git clone git@github.com:stevegrossi/phoenix_chat.git $ cd phoenix_chat $ mix deps...

    即时通讯服务端测试工具

    3. **模块化设计**:ejabberd通过插件系统提供丰富的功能,如多用户聊天室、外部认证机制、存储后端等,可以根据需求进行定制。 4. **API与集成**:ejabberd提供了REST API和客户端库,方便与其他系统集成,如Web...

    converse.js客户端

    - **实时聊天**:Converse.js能够实现实时的一对一聊天和多用户聊天室。 - **离线消息**:即使用户离线,也能存储和发送消息。 - **多设备同步**:通过XMPP协议,Converse.js可以在多个设备间同步聊天记录。 - **...

    XMPP学习入门笔记

    - 加入`jdev@conference.jabber.org`聊天室。 - 发送邮件至`jdev@jabber.org`邮件列表(需要订阅才能发信)。 通过这种方式,开发者可以及时获得最新信息和技术支持,同时也可以为XMPP的发展做出贡献。 #### 四、...

    Building-a-Jabber-client-for-iOS-master

    7. **扩展功能**:XMPP框架支持许多扩展,例如文件传输、多用户聊天室等,你可以根据需求选择添加。 在开发过程中,确保遵循Apple的iOS设计指南,提供良好的用户体验。例如,使用推送通知来提醒新消息,以及在后台...

    chat_ex

    【描述】:“Chat_ex”是一个基于Elixir编程语言开发的聊天室应用示例。Elixir是一种动态类型的函数式编程语言,它运行在 Erlang VM (BEAM) 上,特别适合构建高并发、分布式和容错性强的系统。Chat_ex项目旨在展示...

    “后端开发框架”资源推荐

    它特别适合用于构建需要实时通信的Web应用,如聊天室或在线游戏。 ### 三、框架选择建议 在选择合适的后端开发框架时,应考虑以下几个因素: - **项目需求**:不同的项目可能需要不同类型的框架。例如,如果项目...

    RabbitMq使用手册

    2.5 消息通讯场景:使用 RabbitMq 可以实现点对点消息队列和聊天室效果。 RabbitMq 开发指导: 1. 配置文件:修改本地配置文件 rabbitmq.properties,设置 rabbitMQ 服务器地址、端口和用户信息。 2. 添加依赖包...

    ejabberd-15.07-osx-installer.app.zip

    ejabberd是一款开源的XMPP服务器,广泛应用于实时通讯系统,如即时消息、在线状态显示、多用户聊天室等功能的实现。它基于Erlang编程语言,这使得ejabberd具有高度可扩展性和高容错性。 ejabberd-15.07-osx-...

    2024年java面试题-消息中间件RabbiMQ面试题

    - **消息通讯**:内置了高效的通信机制,可用于构建点对点消息系统或聊天室等。 #### 二、MQ的关键特性详解 **2.1 解耦、异步与削峰** - **解耦**:在不使用消息队列的情况下,如果A系统需要向BCD等多个系统发送...

    Elixir-Ignite:应用Elixir知识的几个项目

    Phoenix 使用Ecto作为ORM(对象关系映射),提供数据库交互,同时其通道(Channels)特性支持实时Web应用,如聊天室、实时数据更新等。 **5. 数据结构与模式匹配** Elixir 提供了多种内置数据结构,如列表、元组、...

    PHP下用Swoole实现Actor并发模型的方法

    在进程关系部分,作者通过一个聊天室房间模型的示例来说明如何定义一个Actor。在这个例子中,定义了一个名为RoomActor的类,它继承自EasySwoole的AbstractActor。在这个Actor模型中,存在proxy和worker两组进程。...

Global site tag (gtag.js) - Google Analytics