在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
传统AJAX技术 JavaScript 调用 XMLHttpRequest 对象发出 HTTP 请求,JavaScript 响应处理函数根据服务器返回的信息对 HTML 页面的显示进行更新。 使用 AJAX 实现“服务器推”与传统的 AJAX 应用不同之处在于:
以上来自IDM DW
做了一个简单的及时通讯程序,总结一下各方面。
那么怎么做到长连接: 上面的方法打个比方就是你定时让一个人去考察市场,然后考察完毕马上回来,你来做相应的处理。结果是你不能在市场发生变更的第一时间得到市场消息。
长连接方式: 这个方法就好像,你安排一个人在市场,让他在市场发生变化的时候马上回来通知你,然后马上回去继续考察。
下面是我用Ext+PHP自己做的例子,算是一个入门。 Ext版本:4.0 定义类ChatWin 1 Ext.define('Leaves.im.ChatWin', { 2 extend : 'Ext.window.Window', 3 timestamp : 0, 4 mainWindow : null, 5 6 initComponent : function() { 7 this.createWindow(this); 8 }, 9 10 createWindow : function(me) { 11 me.display = Ext.create('Ext.container.Container', { 12 width : '100%', 13 height : 200, 14 html:'' 15 }); 16 17 var editor = Ext.create('Ext.form.field.HtmlEditor', { 18 xtype : 'htmleditor', 19 enableColors : false, 20 enableAlignments : false, 21 width : '100%' 22 }); 23 24 var mainPanel = Ext.create('Ext.panel.Panel', { 25 frame : true, 26 height : '100%', 27 width : '100%', 28 layout : 'vbox', 29 items : [ me.display, editor ], 30 buttons : [ { 31 text : '发送', 32 handler : function() { 33 me.sendMessage(editor.getValue()); 34 editor.setValue(); 35 editor.focus(); 36 } 37 } ] 38 }); 39 40 me.mainWindow = Ext.create('Ext.window.Window', { 41 title : '聊天室', 42 height : 500, 43 width : 600, 44 layout : 'fit', 45 items : [ mainPanel ] 46 }); 47 }, 48 49 /** 50 * 获取消息 timestamp 最后一次获取消息时间 51 */ 52 getMessage : function(timestamp) { 53 var me = this; 54 Ext.Ajax.request({ 55 url : 'comet.php', 56 success : function(response) { 57 var text = response.responseText; 58 var jsonObj = Ext.JSON.decode(text); 59 60 me.display.update(me.display.html+jsonObj.msg+'<br/>',true); 61 62 63 timestamp = jsonObj.timestamp; 64 me.getMessage(jsonObj.timestamp); 65 }, 66 failure : function(response) { 67 var text = response.responseText; 68 var jsonObj = Ext.JSON.decode(text); 69 me.getMessage(jsonObj.timestamp); 70 }, 71 params : { 72 timestamp : timestamp 73 } 74 }); 75 }, 76 /** 77 * 发送消息 message 要发送的消息 78 */ 79 sendMessage : function(message) { 80 Ext.Ajax.request({ 81 url : 'comet.php', 82 params : { 83 msg : message 84 } 85 }); 86 }, 87 88 showChatWin : function(y, x, title) { 89 this.mainWindow.title = title; 90 this.mainWindow.y = y; 91 this.mainWindow.x = x; 92 this.getMessage(this.timestamp); 93 this.mainWindow.show(); 94 } 95 }, function() { 96 Ext.Ajax.timeout = 900000; 97 }); 启动类comet.js 1 Ext.Loader.setConfig({ 2 enabled : true, 3 paths : { 4 'Leaves.im.ChatWin' : 'ChatWin.js' 5 } 6 }); 7 Ext.onReady(function() { 8 var charWin = Ext.create('Leaves.im.ChatWin'); 9 charWin.showChatWin(100,100,'我的聊天框'); 10 }); 主页面 1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> 2 <html> 3 <head> 4 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 5 <title>Comet demo</title> 6 <link href="../ExtJs/resources/css/ext-all.css" rel="stylesheet" 7 type="text/css"> 8 <script type="text/javascript" src="../ExtJs/ext-all-debug.js"></script> 9 <script type="text/javascript" src="comet.js"></script> 10 </head> 11 <body> 12 13 </body> 14 </html> 服务器PHP脚本 1 <?php 2 $filename = dirname ( __FILE__ ) . '/data.txt'; 3 $msg = isset ( $_POST ['msg'] ) ? $_POST ['msg'] : ''; 4 5 if ($msg != '') { 6 file_put_contents ( $filename, $msg ); 7 die (); 8 } 9 10 set_time_limit ( 0 ); 11 $lastmodif = isset ( $_POST ['timestamp'] ) ? $_POST ['timestamp'] : 0; 12 // 取得文件最后修改时间 13 $currentmodif = filemtime ( $filename ); 14 15 while ( $currentmodif <= $lastmodif ) { 16 // 有释放CPU占用率的作用 17 usleep ( 100000 ); 18 // 清除文件缓存信息 19 clearstatcache (); 20 $currentmodif = filemtime ( $filename ); 21 } 22 23 $response = array (); 24 $response ['msg'] = file_get_contents ( $filename ); 25 $response ['timestamp'] = $currentmodif; 26 echo json_encode ( $response ); 27 ob_flush (); 28 flush (); 29 ?> |
2022-08-17
2022-09-18
2022-08-17
2022-07-29
2022-08-15
请发表评论