校内网基于aflax的推技术简要分析

来源:互联网 发布:制作一元购物软件 编辑:程序博客网 时间:2024/04/28 10:13
 

这几天看很多人玩校内网的游戏,对其后台服务器推技术产生了巨大兴趣~于是抓代码研究,发现使用了 flash的xmlsocket与js结合的方法。于是google一下。找到了www.aflax.org,大体架构如下(仅仅推技术层面,其他架构不予考虑):
aflax会构建一个aflax.swf,然后由aflax.js 控制aflax.swf 建立xmlsocket通道。数据的接受由服务器从xmlsocket推向swf。而swf收到后,跟aflax.js通信处理。
研究一个简单的chat例子吧,这是官网提供的一个例子,我们慢慢研究

  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">  
  2. 2 <html>  
  3. 3 <head>  
  4. 4 <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />  
  5. 5 <title>AFLAX: A JavaScript Library for Macromedia's Flash&trade; Platform</title>  
  6. 6   
  7. 7 <LINK href='../../include/style.css' type='text/css' rel='stylesheet'>  
  8. 8 <script type="text/javascript" src="../../include/nifty.js"></script>  
  9. 9 <script type="text/javascript" src="../../lib/AFLAX/aflax.js"></script>  
  10. 10 <script type="text/javascript" src="../../lib/MochiKit/MochiKit.js"></script>  
  11. 11   
  12. 12 <script>  
  13. 13     var aflax = new AFLAX("../../lib/AFLAX/aflax.swf");  
  14. 14     var connection = null;  
  15. 15     var username = "Unknown";  
  16. 16     var firstLine = true;  
  17. 17      
  18. 18     function go()  
  19. 19     {  
  20. 20     }     
  21. 21      
  22. 22     function onConnectEvent(val)  
  23. 23     {  
  24. 24         if(val)  
  25. 25             appendData("Connection successful.");  
  26. 26         else  
  27. 27             appendData("Could not make connection to server.");  
  28. 28     }  
  29. 29      
  30. 30     function onDataEvent(str)  
  31. 31     {  
  32. 32         var i = str.indexOf(":");  
  33. 33         var name = str.substring(0, i);  
  34. 34         var rest = str.substring(i+1);  
  35. 35         var color = "blue";  
  36. 36         if(name == username) color = "red";  
  37. 37         appendData("<font color='" + color + "'>" + name + ':</font> ' + rest);  
  38. 38     }  
  39. 39      
  40. 40     function onCloseEvent()  
  41. 41     {  
  42. 42         appendData("Connection closed.");  
  43. 43     }  
  44. 44   
  45. 45     function send(str)  
  46. 46     {  
  47. 47         connection.send(username + ': ' + str);  
  48. 48     }  
  49. 49      
  50. 50     function showUI(name)  
  51. 51     {  
  52. 52         username = name;  
  53. 53           
  54. 54         var entry = document.getElementById("nameEntry");  
  55. 55         entry.style.visibility = "hidden";  
  56. 56         entry.style.display = "none";  
  57. 57   
  58. 58         var ui = document.getElementById("chatUI");  
  59. 59         ui.style.visibility = "visible";  
  60. 60         ui.style.display = "block";  
  61. 61   
  62. 62         connection = new AFLAX.Socket(aflax, "www.aflax.org", 7777,   
  63. 63             "onConnectEvent", "onDataEvent", "onCloseEvent");  
  64. 64     }  
  65. 65      
  66. 66     function appendData(str)  
  67. 67     {  
  68. 68         var chat = document.getElementById("chat");  
  69. 69         chat.innerHTML += str + "<BR>";  
  70. 70         chatchat.scrollTop = chat.scrollHeight - chat.clientHeight;  
  71. 71     }  
  72. 72      
  73. 73 </script>  
  74. 74   
  75. 75 </head>  
复制代码

看13行, var aflax = new AFLAX("../../lib/AFLAX/aflax.swf");  构建一个Aflax对象,传递了swf,
162         </p>  
163           
164         <script>  
165             aflax.insertFlash(1,1, "#ffffff", "go", true);  
166         </script>  
167      
168         <p>
在165行,因为是一个chat,并没有用swf,就只是把aflax偷偷的放进了</p>里,并且回调函数是go。
62行:
         connection = new AFLAX.Socket(aflax, "www.aflax.org", 7777,   
63             "onConnectEvent", "onDataEvent", "onCloseEvent");  
建立了一个socket链接,自己看看js里面,实际上建立的是一个xmlsocket,还有三个回调函数,用于处理链接事件,收到数据事件,和关闭事件。
好了,我们来发一下信息

<input style="width:500px" onkeyup="if(event.keyCode == 13) { send(this.value); this.value=''; }">

function send(str)  
46     {  
47         connection.send(username + ': ' + str);  
48     }  

js会把信息控制swf发出去,然后,收到后:
  function onDataEvent(str)  
31     {  
32         var i = str.indexOf(":");  
33         var name = str.substring(0, i);  
34         var rest = str.substring(i+1);  
35         var color = "blue";  
36         if(name == username) color = "red";  
37         appendData("<font color='" + color + "'>" + name + ':</font> ' + rest);  
38     }  

回调函数调用了appendData
var chat = document.getElementById("chat");  
69         chat.innerHTML += str + "<BR>";  
70         chat.scrollTop = chat.scrollHeight - chat.clientHeight;  
控件刷新一下页面就行了。这样一个chat就完成了。
自己写个xmlsocket测试一下吧,记得xmlsocket穿越不了防火墙和代理~

原创粉丝点击