DWR comet 长连接实现在线对话-简易版
第一个实验,先调试实现不区分客户端的在线对话,即所有的在线用户发言其他人都可以收到消息
多手记下http通信协议中的三次握手
第一次
建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。
第二次
服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次
客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
后面只需要理解数据传输就可以了
(客户端)请求数据 --> (服务器)收到相应,传输用户需要的数据 --> (客户端)接收数据并显示
comet的原理实际就是在客户端等待服务器相应的时候使用长连接的方式延长了服务器向客户端发送数据的时间,一般是1分钟左右
旋转的菊花是亮点
如图所示,客户端一直等待服务器相应,1分钟后中断连接重新发送连接请求进入下一个1分钟的等待时间直到服务器返回数据后结束本次连接再次发送一个新的请求等待服务器发送数据
上图是sina微博使用comet实现的长连接方式实现消息推送,1m41s中前面的连接即等待数据的耗时,当微博获取了更新信息的时候就会结束此次连接打开一个新的等待
从头信息可以看出新浪微博也不得不使用jetty作为消息服务器发送即时消息
目前为止我仅对DWR简单试验了一下,虽然js的包比较大,不过能够实现即时消息还是值得使用的
简单的测试类只需要jar文件、一个java消息处理文件、dwr配置文件、web.xml就可以得到一个简单的测试项目
public class Message {private List<String> messages = new LinkedList<String>();public void addMessage(String message) {System.out.println("消息:" + message);messages.add(message);Browser.withCurrentPage(new Runnable() {// 启用监听客户端当前页线程public void run() {// 把数据添加到客户端调用的方法中ScriptSessions.addFunctionCall("receiveMessages", messages);}});}}