我的im解决方案

最近公司网站需要做web在线聊天的功能,我们的解决方案是这样的。

技术构成如下:php+servlet+smack

服务器采用开源的openfire。

方案1:

具体流程是,前端采用的php通过ajax连接一个servlet去实时获取消息,这个servlet里有个while死循环,让他隔1秒去读一个收消息的map,如果收到消息,马上ajax长连接就返回了,php显示消息后,马上在ajax的回调方法上递归调用取消息js函数,连上边同一个servlet;发消息是php通过ajax连一个发消息servlet,这个servlet将消息发到一个发消息map上,就返回了。当用户登入时连openfire,同时开启两个线程,一个线程监听openfire服务器,将收到的消息放到收消息map里,这个线程里有个死循环,知道用户退出,线程判断session是否存活,结束线程;另一个线程是发消息线程,他每隔1秒去读取发消息map里的消息,当有消息时,就把消息发到openfire,当用户退出时结束线程。

      这样就有两个map,一个存收到的消息,键是用户id,值是一个存放消息的queue;一个是发送消息的map,键是用户id,值是需要发送的消息queue。

      每个登入用户有两个线程在后台运行,一个用来监听openfire上的消息;一个用来发送消息。

方案2:

采用dwr推的技术。后台两个类,一个发送dwr消息,一个接受openfire发来的消息。接收类有的死循环,不断接收openfire服务器监听到的消息,然后推到页面。

通过nginx解决dwr跨域问题。

你可能感兴趣的:(PHP,Ajax,servlet,DWR,服务器,IM)