为了熟悉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连接断开进行处理,下一步对这个进行修改。
分享到:
相关推荐
一、Erlang聊天室服务器端 1. 并发处理:Erlang的轻量级进程(processes)是其并发特性的重要体现。在这个聊天室服务器中,每个连接的客户端都会被分配一个独立的进程来处理,这样可以确保每个会话的独立性和并发性...
这两个压缩包结合使用,就可以构建一个简单的Erlang聊天室系统,用户可以通过客户端连接到服务器,进行实时的文本交流。通过阅读和理解这些代码,开发者可以学习到Erlang的并发编程技巧、网络通信以及如何实现一个...
本文将深入探讨“echatServer”这个Erlang聊天室服务器的源码,解析其核心概念和技术。 1. **进程模型** Erlang中的进程是轻量级的,它们之间通过消息传递进行通信。在echatServer中,每个用户连接可能对应一个...
综上所述,"nitrogen 聊天室"是一个利用Erlang和Nitrogen框架构建的高效内部沟通工具,其特点是实时通信、文件分享和安全控制,体现了Erlang在构建此类系统时的优势。通过深入理解Erlang和Nitrogen,我们可以定制和...
- **示例**: 设计一个简单的聊天室应用,包括客户端和服务器端。 - **功能**: - 客户端可以发送消息到服务器。 - 服务器广播消息给所有在线客户端。 - 支持用户登录和退出。 #### 四、健壮性 **1.4.1 超时 ...
多shell环境意味着多个独立运行的Erlang虚拟机(VM),它们之间可以通过发送和接收消息进行通信,模拟聊天室中的用户对话。每个shell可以看作是一个用户,它们在各自的环境中运行着聊天程序实例,通过消息传递进行...
5. **Phoenix Channels**:Phoenix Channels是Phoenix框架中的实时通信组件,它们基于WebSockets,允许在客户端和服务器之间建立多个主题频道,从而实现实时的数据交换,如聊天室中的消息传递。 6. **数据库集成**...
凤凰聊天室 使用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能够实现实时的一对一聊天和多用户聊天室。 - **离线消息**:即使用户离线,也能存储和发送消息。 - **多设备同步**:通过XMPP协议,Converse.js可以在多个设备间同步聊天记录。 - **...
- 加入`jdev@conference.jabber.org`聊天室。 - 发送邮件至`jdev@jabber.org`邮件列表(需要订阅才能发信)。 通过这种方式,开发者可以及时获得最新信息和技术支持,同时也可以为XMPP的发展做出贡献。 #### 四、...
7. **扩展功能**:XMPP框架支持许多扩展,例如文件传输、多用户聊天室等,你可以根据需求选择添加。 在开发过程中,确保遵循Apple的iOS设计指南,提供良好的用户体验。例如,使用推送通知来提醒新消息,以及在后台...
【描述】:“Chat_ex”是一个基于Elixir编程语言开发的聊天室应用示例。Elixir是一种动态类型的函数式编程语言,它运行在 Erlang VM (BEAM) 上,特别适合构建高并发、分布式和容错性强的系统。Chat_ex项目旨在展示...
它特别适合用于构建需要实时通信的Web应用,如聊天室或在线游戏。 ### 三、框架选择建议 在选择合适的后端开发框架时,应考虑以下几个因素: - **项目需求**:不同的项目可能需要不同类型的框架。例如,如果项目...
2.5 消息通讯场景:使用 RabbitMq 可以实现点对点消息队列和聊天室效果。 RabbitMq 开发指导: 1. 配置文件:修改本地配置文件 rabbitmq.properties,设置 rabbitMQ 服务器地址、端口和用户信息。 2. 添加依赖包...
ejabberd是一款开源的XMPP服务器,广泛应用于实时通讯系统,如即时消息、在线状态显示、多用户聊天室等功能的实现。它基于Erlang编程语言,这使得ejabberd具有高度可扩展性和高容错性。 ejabberd-15.07-osx-...
- **消息通讯**:内置了高效的通信机制,可用于构建点对点消息系统或聊天室等。 #### 二、MQ的关键特性详解 **2.1 解耦、异步与削峰** - **解耦**:在不使用消息队列的情况下,如果A系统需要向BCD等多个系统发送...
Phoenix 使用Ecto作为ORM(对象关系映射),提供数据库交互,同时其通道(Channels)特性支持实时Web应用,如聊天室、实时数据更新等。 **5. 数据结构与模式匹配** Elixir 提供了多种内置数据结构,如列表、元组、...
在进程关系部分,作者通过一个聊天室房间模型的示例来说明如何定义一个Actor。在这个例子中,定义了一个名为RoomActor的类,它继承自EasySwoole的AbstractActor。在这个Actor模型中,存在proxy和worker两组进程。...