我没做过,不过我的想法是:聊天记录存在数据库中,table:chatroom 字段:id(自动增长),from(发话者),to(接收者),secrecy(是否为密语),motion(表情代号),……status(是否已发出default 0) 进入聊天的页面要删除chatroom中一些纪录,使之保持最后n条纪录(比如20条,是聊天室的可见语句,也起保密作用). 内嵌一小到不可见的页面,不断刷新,发现status=0的纪录,则刷新聊天页面。 聊天页面:update chatroom set status=1 where status=0; select * from chatroom order by id desc limit 20 ; while(……) echo 这样的效果是:不用set_time_limit,也不用固定时间refresh聊天页面,只要有人说话才刷屏,好像在web push一样,呵呵。
进入聊天的页面要删除chatroom中一些纪录,使之保持最后n条纪录(比如20条,是聊天室的可见语句,也起保密作用).
内嵌一小到不可见的页面,不断刷新,发现status=0的纪录,则刷新聊天页面。
聊天页面:update chatroom set status=1 where status=0;
select * from chatroom order by id desc limit 20 ;
while(……)
echo 这样的效果是:不用set_time_limit,也不用固定时间refresh聊天页面,只要有人说话才刷屏,好像在web push一样,呵呵。
这是我自己想的,事实上我没有实践过,网上那么多聊天室现成代码,我懒得自己编了,罪过罪过…… 不知想法正确否,摆出来讨论一下。
要注意在同一聊天室里有很多的人,不是一个人。
如果把比较 status 字段是否为 0 的条件改为比较消息发送时间比较好:
每次刷新页面时记录最后一条接收到的消息的发送时间 (记录在 COOKIE 或 SESSION 中),下次刷新时就取得所有时间在这个时间之后的所有消息,这样每个聊天者就都能看到所有的消息了。
注意::进入聊天的页面要删除chatroom中一些纪录,使之保持最后n条纪录(比如20条,是聊天室的可见语句,也起保密作用).
在聊天页面中,第二个用户进来后,看到了最后20条,第三个进来后,看到了新的最后二十条,跟前面的人是一样的
你怎么会说什么都看不见呢?这样吧,我就实践一下编出来大家看看吧,希望很快搞定,界面就不考虑了
不过不是在进入页面看不见,而是……
是我没想全,不好意思。我用session实现了,基本上能用,功能不强。关键步骤:
进入页面后session_register当前时间
发言在数据库中记录发言时间
内嵌小页面刷新,用session中当前时间与数据库中发言时间比较判断是否有新的发言,如有则刷新聊天页面,并session_register新的当前时间,如无则不做操作。
聊天页面取最后几条聊天纪录。完毕
页面上:会出现滴答的声音,会出现不停的reload该页面功能上:速度不行,聊天室要有很强的实时显示能力,解决方法:用activex控件,聊天内容保存在服务器端的一个全局变量中(最好在内存中)soap+xml可以解决页面上的问题,在asp中可以用application作为一个全局变量(速度有保证)