基于Google AppEngine的XMPP和Channel Service的机器人+Web群聊的一些实现思路和简介
2011-01-18 04:50 onm 阅读(396) 评论(0) 编辑 收藏 举报Google AppEngine提供了很好的服务,最近在AppEngine上做了一个机器人+Web群聊的东西,今天主要简单介绍一下Service中的XMPP Python API和The Channel API(Python)以及群聊实现的一些思路。
XMPP是全称Extensible Messaging and Presence Protocol,是一种以XML为基础的开放式实时通信协议,XMPP Python API封装了XMPP协议,提供了非常简单实用的API。API一共提供了三个方法,分别是get_presence(获取用户是否在线),send_invite(给某个用户发送邀请),send_message(给用户发送信息,这个方法提供了群发功能)。细节参见这里。
API还提供了一个封装了消息的类Message,提供了发送者,接收者,信息主体等信息,还提供了一个实例方法reply(回复信息)。细节参见这里。
群聊的情景是,一方是用户,一方是服务器机器人,当一名用户发送消息后,机器人转发该信息给所有群用户。
当用户给机器人发送消息时,其实就是POST信息到/_ah/xmpp/message/chat/,可以利用上面说到了Message类将POST过来的数据进行封装,然后获得相关信息,再通过send_message方法转发给所有的群用户。
这个机器人版本的群就好了,很简单。如果你有兴趣了解XMPP协议的具体内容,GIYF(Google Is Your Friend)。关于XMPP协议上面涉及到比较重要的概念有jid,和信息格式。
题外话Google Talk就是基于XMPP协议的聊天软件。
对于Web网页版聊天,发消息实现起来简单,只要POST一条数据给服务器,然后Ajax刷新刚才发送出去的东西就好了。而对于Web客户端接收消息,存在一个技术方面的难点。我们都知道HTTP是无连接的,也就是浏览器请求服务器后,Web客户端和服务器就失去了链接,而且是Web客户端主动请求服务器,服务器才会给你返回相应的内容,而服务器是不会(可能由于安全原因)请求你接受什么的。
原始的方法是可以使用轮询Poll,轮询方法就是每隔一段时间,Web客户端自动请求服务器,检查一下是否有新的消息,如果有新消息,则Ajax更新这段时间产生的消息。但大家都知道轮询的代价很大,所以希望找到一个替代方法。
最近在网上看到Comet模型,Wiki上如是说:
Comet is a web application model in which a long-held HTTP request allows a web server to push data to a browser, without the browser explicitly requesting it.
是说Commet模型是在长期持有HTTP请求中,允许web服务器推送数据到浏览器。
Google AppEngine的Channel API就是实现了Comet模型的一个服务,用起来也是简单实用。对于服务端提供了create_channel(创建channel)和send_message(给某个channel发送消息)方法。细节参见这里。
Web客户端提供了一个Channel类,需要由服务器端的create_channel方法产生的token进行实例化,然后调用open方法,打开和服务器沟通的channel。这个类提供了一个重要的属性onmessage,可以通过给onmessage赋值一个回调函数,来响应Web客户端收到的消息。Channel还提供了响应的onopen,onerror,onclose属性,细节参见这里。
这样Web网页版的聊天也就简单多了。思路就是当Web用户发送消息时,遍历所有存在的Channel进行消息转发。
然后在将机器人和Web网页版进行相关整合,机器人+Web群聊就诞生了。
最后总结一句话:发送消息时,由机器人转发所有登录桌面客户端的用户,再通过遍历所有Channel将消息转发给所有在Web网页上聊天的用户。
注:本人才疏学浅,不敢保证一些细节上的问题,这时GIYF。