最近在做有关聊天功能,整体需求就是支持客户端,浏览器端进行多人在线的讨论组聊天。聊天内容支持文字,语音,图片。
设计思路为,使用RabbitMQ作为聊天支持服务,因为RabbitMQ的多语言SDK优势。
因为是多人讨论组形式的聊天,所以采用广播(fanout)方式,同一个讨论组中的人员都订阅相同的exchange。另外,为了监听讨论组内人员的在线情况,再定义一个广播方式的exchange用来广播心跳信息。
以上为消息服务的使用方法和思路,接下来介绍一下关于消息内容的实现思路。
消息内容采用json的方式进行传递,json中定义多个key,包括发送人,消息内容,消息类型等等。
文字类消息比较简单,直接将消息内容放在“消息内容”key对应的value上即可。
图片类消息,首先将图片转换为base64编码的字符串,然后将此字符串作为“消息内容”对应的value发出去。
语音类消息则要依赖apache流媒体服务了。首先各个聊天的C端(客户端和浏览器)采集音频,然后将音频发送到服务端存储到apache流媒体服务上,之后服务端将播放地址返回各个C端。各个C端把播放地址作为“消息内容”对应的value发出去。各个C端在收到消息后,依据播放地址,播放对应的音频。
在图片的采集上,支持用户手动选择文件进行发送,还支持截图,关于截图,推荐使用 牛牛截图(免费,稳定,多语言【http://www.ggniu.cn/】)。
关于音频的采集,浏览器端可以使用 recorder.js【https://github.com/jwagener-soundcloud/recorder.js】来进行音频采集,基于flash。如果是google,请使用google的多媒体支持,google浏览器本身对音频采集已经开放接口,开源实现方案较多。
关于客户端的音频采集,因为我们系统是基于wpf做的,所以推荐使用NAudio【https://github.com/naudio/NAudio】,采集和播放都有支持,稳定方便。