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

Erlang 聊天室程序(六) 设置客户端信息2

阅读更多

上篇 开了个头编写了基本的框架,这次连同客户端服务器端代码一起完善下。

首先修改客户端代码:

之前在数据交换 部分,客户端中定义了一个Message bean类,里面包含了发送一条消息所需要的基本信息,包括id、type、subject、from、to、content等。但这里的

content是一个String 类型,如果要表示更复杂的消息就不太适用了。

由于所有的消息id、type、subject、from、to 这几个成员的类型是确定的,对应的操作方法也是固定的,所以我们抽象出一个抽象类:Packet 用来表示交互中的所有消息:

Packet.java:

 

与之前不同的是这次将Bean解析为JSON String的任务交给Bean本身。可以看到以上代码中并没有定义content的实现,所以具体的消息可根据自身需要来定制。

 

根据这个思想,改造普通消息类Message:

 

再修改下发送部分的代码,直接调用对象的toString()方法:

 

 


新建一个类ClientInfo 表示客户端要设置的信息:

 

 


新建设置客户端消息类:SetClientInfo继承Packet类

 

 


可以看到这里将content 设置为了刚才的ClientInfo 对象。

 

下面修改服务器端:

先要去掉JSON数据解析时的is_binary判断,因为以后发送的消息content里不一定就是binary了。

 


再修改client_manager.erl 中更改客户端信息部分的代码,将content中的json数据转成#clientinfo,再更新到数据表中去。

 

为此新建一个专门的模块util_SetInfoParas.erl处理setClientInfo消息:

 


接着在更新数据库前调用以上代码:

 

client_manager.erl:

 

更新成功后,会将此消息广播给所有的在线用户:

 

chat_room.erl

 


最后需要修改util_MessageParas.erl中的JSON编码部分,判断如果要发送给客户端的Message消息内容是list的话才转成相应的字符串。

 

 

 

 

再修改客户端收到消息后的解析代码:

 


测试结果如下:

 

另外,既然能够设置客户端的昵称了,那么就再实现下发消息时from的替换吧:

先为client_manager添加获取客户端昵称功能,获取不到或undfined就取默认的:


再修改设置个人信息后的通知消息:

 

再修改client_session中下发时的from:

 

 


测试效果如下:

 

 

分享到:
评论

相关推荐

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

    【Erlang聊天室服务器及客户端代码解析】 在IT领域,Erlang是一种面向并发、分布式、容错的编程语言,特别适合构建高可用性的实时系统。本项目提供了一个使用Erlang编写的聊天室服务器端代码以及Java编写的客户端...

    erlang server

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

    converse.js客户端

    这个轻量级的客户端库允许开发者轻松地在网页上集成即时通讯功能,无需用户下载安装任何应用程序。Converse.js与多种XMPP服务器兼容,如Openfire和ejabberd,这使得它成为构建Web聊天应用的理想选择。 **1. XMPP...

    Erlang中文手册

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

    XMPP学习入门笔记

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

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

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

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

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

    ejabberd-15.07-osx-installer.app.zip

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

    即时通讯服务端测试工具

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

    RabbitMq使用手册

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

    chat_ex

    【标题】:Elixir语言构建的聊天室应用——Chat_ex 【描述】:“Chat_ex”是一个基于Elixir编程语言开发的聊天室应用示例。Elixir是一种动态类型的函数式编程语言,它运行在 Erlang VM (BEAM) 上,特别适合构建高...

    phoenix-channel-example

    它们通过 topic(主题)进行消息传递,可以用于实时推送、聊天室或在线游戏等场景。 2. **mix**:这是Elixir的构建和任务管理工具,类似于Ruby的`bundle`或Node.js的`npm`。在项目中,`mix deps.get`用于获取并安装...

Global site tag (gtag.js) - Google Analytics