聊天服务的设计随想

聊天系统

Contents

对于互联的多用户在线游戏,聊天是不可少的。

聊天的类型

这里分类是按用户的多少来分类。

单点类型

很简单如Skype(QQ)那样,你可以和好友,一对一的在线聊天。

多点类型

如Skype,可以自由组织群聊。

现有的几个开源方案

ejabberd

ejabberd(基于Jabber/XMPP协议的即时通讯服务器)是Gameloft现在非常废柴的聊天系统。从开源角度,ejabberd似乎是一款不错的聊天替代品。

优点

  1. 跨平台,容错,集群和模块化.
  2. 容易拓展(轻松的50行用户认证插件代码就集成到现有平台)。
  3. 分布式, 容错, 并基于开放标准的实时通讯系统.
  4. 功能服丰富的XMPP服务器.
  5. 同时适合小规模布署和超大规模布署, 无论它们是否需要可伸缩性.

缺点

  1. 对于移动互联网来说,Jabber/XMPP非常臃肿。(以前公司的分布式聊天平台中当群聊到50人时就非常吃力了)
  2. 部署麻烦。
  3. 维护性差,维护难度大。

openfire

Openfire 采用Java开发,开源的实时协作(RTC)服务器基于XMPP(Jabber)协议。优点是易用安装使用,还提供WEB管理工具。

Jabber/XMPP的弊端

对于移动互联网环境来说,XMPP是臃肿的,实践中表现并非尽人意,延迟,群聊用户支持的用户不多。 从客户端来讲,更为耗电,消息处理延迟,并发量不大。

轻巧的MQTT

MQTT(Message Queuing Telemetry Transport) 是IBM开发的一个即时通讯协议。

优点

  1. 对移动端友好,省电,每秒请求量更为客观。
  2. 协议轻巧,通信的内容协议自由组织。

缺点

  1. 现有的开源实现不多,需要花费些时间实现。

架构设计实现

HTTP协议

JOIN group

POST group/<group-name>/join
group-name: 这是需要加入聊天的组名
username: 用户名
token: 用户令牌

如果用户成功加入,将会返回http状态200及内容:

{
    "chat_host": 1234
    "port" : "",
    "name": "",
    "id" : ,
    "users" : {
        ""
    }

}

为连接聊天室的域名和端口

如果加入失败返回500状态码和内容:

Room full

CHAT MESSAGE Protocal

client向server发送的命令协议比较简单,使用行指令。空格分隔,第一个单词为指令。

GET group datetime

group: 是订阅组消息
datetime: 是用户上次获取消息的时间,如果超过服务的限制会返回过去五分钟的消息。

得到到回复:

ok:1034\r\n
[{‘msg‘: ‘hello group‘ ‘from‘ : ‘user_id‘, datetime: ‘2014-08-11 12:12:123‘, ...},
{‘msg‘: ‘hello group‘ ‘from‘ : ‘user_id3‘, datetime: ‘2014-08-11 12:12:123‘, ...},
...
]

协议头行为状态和内容长度,以英文冒号分隔。

如果失败,将返回错误信息文本:

error:100\r\n
Unknow error
时间: 2024-11-09 06:18:32

聊天服务的设计随想的相关文章

Socket聊天程序——初始设计

写在前面: 可能是临近期末了,各种课程设计接踵而来,最近在csdn上看到2个一样问答(问题A,问题B),那就是编写一个基于socket的聊天程序,正好最近刚用socket做了一些事,出于兴趣,自己抽了几个晚上的空闲时间敲了一个,目前仅支持单聊,群聊,文件传送这些功能.首先,贴出一个丑丑的程序图(UI是用java swing写的,这个早就忘光了,无奈看着JDK的API写了一个),如下图: 服务端设计: 服务端主要有两个操作,一是阻塞接收客户端的socket并做响应处理,二是检测客户端的心跳,如果客

软件设计随想-上下游系统集成问题

Software design thinking 软件设计随想 Service agent (SA) 这个项目与service manager (SM) 集成经历过两种方案,一种是直接与SM的数据库进行集成交互:另外一种就是面向服务的集成,通过SM提供的SMRWS API服务进行交互集成. 我概括地称之为直接面向基准数据源的集成设计(SA->SMDB) 和面向服务的集成设计(SA->SMRWS->SMDB). 今天遇到一个面向服务的集成设计的问题,SMRWS的主从web servers的

本例为模仿微信聊天界面UI设计,文字发送以及语言录制UI(转载)

首页 资讯 精华 论坛 问答 博客 专栏 群组 更多 ▼ 您还未登录 ! 登录 注册 机遇&速度 博客 微博 相册 收藏 留言 关于我 android 仿微信聊天界面,以及语音录制功能 博客分类: android 录音 android 录音android 仿微信聊天界面android 仿微信录音UIandroidandroid 语音 本例为模仿微信聊天界面UI设计,文字发送以及语言录制UI. 1先看效果图:     第一:chat.xml设计 Xml代码   <?xml version=&q

用NodeJS打造可扩展聊天服务

利用Nodejs实现即时通讯的选择最常见的就是socket.io, 首先来说说socket.io 优势: 1. 上手容易 2. 社区活跃(评价优秀开源项目的重要指标) 3. 对开发者友好, 避免开发者适配IE等不支持websocket的浏览器 4. 生态完整, 有对应Android,iOS SDK 缺点: 坑1. 一上生产环境就各种内存高或者cpu占用高 坑2. 扩展性 坑3. 从0.9x的不兼容性升级 坑1 内存问题的解决 socket.io在跑一段时间后, 内存占用并没有下来,猜测难道断开连

Mina airQQ聊天 服务端篇(二)

Mina聊天服务端实现思路:在用户登录的时候.连接服务端而且验证登录用户,假设成功,则将IoSession保存到map<账号,IoSession>中,而且通知该用户的好友上线,然 后再请求好友列表:若不成功,则断开连接. 自己定义协议格式:包头+包体 包头(10字节):包头长度(short)+ 消息类型(byte)+ 内容类型(byte) +  消息命令(short)+ 包体长度(int) 包体:JSON字符串 自己定义编码解码:因为数据在网络传输过程中都是以二进制传输的,所以我们能够自己定义

通讯聚合类Chrome 扩展:All-in-One Messenger,把主流聊天服务聚合在一个应用窗口内

原文地址:http://whosmall.com/?post=420 本文标签: Chrome扩展 Chrome浏览器 通讯聚合类Chrome扩展 All-in-One-Messenger 主流聊天服务聚合 我发现了 All-in-One Messenger,它是一款轻量的 Chrome 扩展,作用与 Franz基本相同,只需要打开一个窗口,所有的通讯服务会以网页标签栏的形式呈现,方便你自如切换,可以大大提高了沟通的效率.但是和「庞大」的 Franz 相比,All-in-One Messenge

服务计算 SO 服务的设计

服务计算: 一.产生:为弥补商业模式和信息技术之间的鸿沟 服务--商业 计算--信息技术 应用面向服务技术(SOA)将商业服务和信息技术相结合的产物 二.解决方面: 1.技术平台与架构 2.服务交付 3.业务管理与整合 三.服务: (1)什么是服务: 服务:至少有一个服务提供者和一个服务消费者并基于一定的商业目标或者解决目标而产生的基于关系的活动. 服务无处不在 (2)IT服务与非IT服务的差别: 1.衡量KPI(key performance indicators)方式不同: 如:对于看病的活

孢子框架-互联网金融平台微服务架构设计

按照孢子框架要义对互联网金融理财平台进行微服务架构设计.假设我们设计的目标是5年后的陆金所(https://www.lu.com/).陆金所简介,平安集团旗下理财平台,是中国最大的网络投融资平台之一,2011年9月在上海注册成立,注册资本金8.37亿元,lufax结合全球金融发展与互联网技术创新,在健全的风险管控体系基础上,为中小企业及个人客户提供专业.可信赖的投融资服务,帮助他们实现财富增值.截至2014年1月末,注册用户已逾570万. l 需求分析 参照陆金所,获得如下核心需求矩阵. 分类

改进基于Boost.Asio的聊天服务

Boost.Asio是个非常易用的C++异步网络库,官网上有很详细文档和示例代码.其中一个示例是聊天服务,分成chat_message.chat_client.chat_server这么三个部分.chat_server的启动代码如下. 1 if (argc < 2) 2 { 3 std::cerr << "Usage: chat_server <port> [<port> ...]\n"; 4 return 1; 5 } 6 7 boost::