Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
ʵʱWebµÄ·¢Õ¹Óëʵ¼ù
 
×÷ÕߣºAlex MacCaw À´Ô´£ºINfoQ ·¢²¼ÓÚ£º2017-1-13
  1909  次浏览      27
 

ΪʲôʵʱWebÕâÃ´ÖØÒª£¿ÎÒÃÇÉú»îÔÚÒ»¸öʵʱ£¨real-time£©µÄÊÀ½çÖУ¬Òò´ËWebµÄ×îÖÕ×î×ÔÈ»µÄ״̬ҲӦµ±ÊÇʵʱµÄ¡£Óû§ÐèҪʵʱµÄ¹µÍ¨¡¢Êý¾ÝºÍËÑË÷¡£ÎÒÃǶԻ¥ÁªÍøÐÅϢʵʱÐÔµÄÒªÇóÒ²Ô½À´Ô½¸ß£¬Èç¹ûÐÅÏ¢»òÏûÏ¢ÑÓʱ¼¸·ÖÖÓºó²Å¸üУ¬¼òÖ±ÈÃÈËÎÞ·¨ÈÌÊÜ¡£ÏÖÔںܶà´ó¹«Ë¾£¨ÈçGoogle¡¢FacebookºÍTwitter£©ÒѾ­¿ªÊ¼¹Ø×¢ÊµÊ±Web£¬²¢ÌṩÁËʵʱÐÔ·þÎñ¡£ÊµÊ±Web½«ÊÇδÀ´×îÈÈÃŵϰÌâÖ®Ò»¡£

Ò»¡¢ÊµÊ±WebµÄ·¢Õ¹ÀúÊ·

´«Í³µÄWebÊÇ»ùÓÚHTTPµÄÇëÇó/ÏìӦģÐ͵ģº¿Í»§¶ËÇëÇóÒ»¸öÐÂÒ³Ãæ£¬·þÎñÆ÷½«ÄÚÈÝ·¢Ë͵½¿Í»§¶Ë£¬¿Í»§¶ËÔÙÇëÇóÁíÍâÒ»¸öÒ³ÃæÊ±ÓÖÒªÖØÐ·¢ËÍÇëÇ󡣺óÀ´ÓÐÈËÌá³öÁËAJAX£¬AJAXʹµÃÒ³ÃæµÄÌåÑé¸ü¼Ó¡°¶¯Ì¬¡±£¬¿ÉÒÔÔÚºǫ́·¢Æðµ½·þÎñÆ÷µÄÇëÇó¡£µ«ÊÇ£¬Èç¹û·þÎñÆ÷Óиü¶àÊý¾ÝÐèÒªÍÆË͵½¿Í»§¶Ë£¬ÔÚÒ³Ãæ¼ÓÔØÍê³ÉºóÊÇÎÞ·¨ÊµÏÖÖ±½Ó½«Êý¾Ý´Ó·þÎñÆ÷·¢Ë͸ø¿Í»§¶ËµÄ¡£ÊµÊ±Êý¾ÝÎÞ·¨±»¡°ÍÆËÍ¡±¸ø¿Í»§¶Ë¡£

ΪÁ˽â¾öÕâ¸öÎÊÌ⣬ÓÐÈËÌá³öÁ˺ܶà½â¾ö·½°¸¡£×î¼òµ¥£¨±©Á¦£©µÄ·½°¸ÊÇÓÃÂÖѯ£ºÃ¿¸ôÒ»¶Îʱ¼ä¶¼»áÏò·þÎñÆ÷ÇëÇóÐÂÊý¾Ý¡£ÕâÈÃÓû§¸Ð¾õÓ¦ÓÃÊÇʵʱµÄ¡£Êµ¼ÊÉÏÕâ»áÔì³ÉÑÓʱºÍÐÔÄÜÎÊÌ⣬ÒòΪ·þÎñÆ÷ÿÃë¶¼Òª´¦Àí´óÁ¿µÄÁ¬½ÓÇëÇó£¬Ã¿´ÎÇëÇó¶¼»áÓÐTCPÈý´ÎÎÕÊÖ²¢¸½´øHTTPµÄÍ·ÐÅÏ¢¡£¾¡¹ÜÏÖÔںܶàÓ¦ÓÃÈÔÔÚʹÓÃÂÖѯ£¬µ«Õâ²¢²»ÊÇ×îÀíÏëµÄ½â¾ö·½°¸¡£

ºóÀ´Ëæ×ÅComet¼¼ÊõµÄÌá³ö£¬ÓÖ³öÏÖÁ˺ܶà¸ü¸ß¼¶µÄ½â¾ö·½°¸¡£ÕâЩ¼¼Êõ·½°¸°üÀ¨ÓÀ¾ÃÖ¡£¨forever frame£©¡¢XHRÁ÷£¨xhr-multipart£©¡¢htmlfile£¬ÒÔ¼°³¤ÂÖѯ¡£³¤ÂÖѯÊÇÖ¸£¬¿Í

»§¶Ë·¢ÆðÒ»¸öµ½·þÎñÆ÷µÄXHRÁ¬½Ó£¬Õâ¸öÁ¬½ÓÓÀ²»¹Ø±Õ£¬¶Ô¿Í»§¶ËÀ´ËµÁ¬½ÓʼÖÕÊÇ¹ÒÆð״̬¡£µ±·þÎñÆ÷ÓÐÐÂÊý¾Ýʱ£¬¾Í»á¼°Ê±µØ½«ÏìÓ¦·¢Ë͸ø¿Í»§¶Ë£¬½Ó×ÅÔÙ½«Á¬½Ó¹Ø±Õ¡£È»ºóÖØ¸´Õû¸ö¹ý³Ì£¬Í¨¹ýÕâÖÖ·½Ê½¾ÍʵÏÖÁË¡°·þÎñÆ÷ÍÆ¡±£¨server push£©¡£

Comet¼¼ÊõÊǷDZê×¼µÄhack¼¼Êõ£¬ÕýÒòΪ´Ë£¬ä¯ÀÀÆ÷¶ËµÄ¼æÈÝÐԾͳÉÁËÎÊÌâ¡£Ê×ÏÈ£¬ÐÔ

98 ÄÜÎÊÌâÎÞ·¨½â¾ö£¬Ïò·þÎñÆ÷·¢ÆðµÄÿ¸öÁ¬½Ó¶¼´øÓÐÍêÕûµÄHTTPÍ·ÐÅÏ¢£¬Èç¹ûÄãµÄÓ¦ÓÃÐèÒªºÜµÍµÄÑÓʱ£¬Õ⽫ÊÇÒ»¸ö¼¬ÊÖµÄÎÊÌâ¡£µ±È»²»ÊÇ˵Comet±¾ÉíÓÐÎÊÌ⣬ÒòΪ»¹Ã»ÓÐÆäËûÌæ´ú·½°¸Ç°CometÊÇÎÒÃǵÄΨһѡÔñ¡£

ä¯ÀÀÆ÷²å¼þ£¨ÈçFlash£©ºÍJavaͬÑù±»ÓÃÓÚʵÏÖ·þÎñÆ÷ÍÆ¡£ËüÃÇ¿ÉÒÔ»ùÓÚTCPÖ±½ÓºÍ·þÎñÆ÷½¨Á¢socketÁ¬½Ó£¬ÕâÖÖÁ¬½Ó·Ç³£ÊʺϽ«ÊµÊ±Êý¾ÝÍÆ¸ø¿Í»§¶Ë¡£ÎÊÌâÊDz¢²»ÊÇËùÓеÄä¯ÀÀÆ÷¶¼°²×°ÁËÕâЩ²å¼þ£¬¶øÇÒËüÃdz£³£±»·À»ðǽÀ¹½Ø£¬ÌرðÊÇÔÚ¹«Ë¾ÍøÂçÖС£

ÏÖÔÚHTML5¹æ·¶ÎªÎÒÃÇ×¼±¸ÁËÒ»¸öÌæ´ú·½°¸¡£µ«Õâ¸ö¹æ·¶ÉÔ΢ÓÐЩ³¬Ç°£¬ºÜ¶àä¯ÀÀÆ÷¶¼»¹²»Ö§³Ö£¬ÌرðÊÇIE£¬¶ÔÓÚÏÖÔںܶ࿪·¢ÕßÀ´Ëµ°ïÖú²»´ó£¬¼øÓڴ󲿷Öä¯ÀÀÆ÷»¹Î´ÊµÏÖHTML5µÄWebSocket£¬ÏÖÐÐ×îºÃµÄ°ì·¨ÈÔÈ»ÊÇʹÓÃComet¡£

¶þ¡¢WebSocket

WebSocket£¨http://dev.w3.org/html5/websockets£©ÊÇHTML5¹æ·¶£¨http://www.w3.org/TR/html5£©µÄÒ»²¿·Ö£¬ÌṩÁË»ùÓÚTCPµÄË«ÏòµÄ¡¢È«Ë«¹¤µÄsocketÁ¬½Ó¡£ÕâÒâζ×Å·þÎñÆ÷¿ÉÒÔÖ±½Ó½«Êý¾ÝÍÆË͸ø¿Í»§¶Ë£¬¶ø²»ÐèÒª¿ª·¢ÕßÇóÖúÓÚ³¤ÂÖѯ»ò²å¼þÀ´ÊµÏÖ£¬ÕâÊÇÒ»¸öºÜ´óµÄ½ø²½¡£¾¡¹ÜÓÐһЩä¯ÀÀÆ÷ʵÏÖÁËWebSocket£¬µ«ÓÉÓÚһЩ°²È«ÎÊÌâûÓнâ¾ö£¬Òò´ËЭÒ飨http://goo.gl/F7lvW£©ÈÔÈ»ÔÚÐÞ¶©Ö®ÖС£È»¶øÕâ²»»á×è°­ÎÒÃǵĽŲ½£¬ÕâЩ°²È«ÎÊÌâÊôÓÚ¼¼ÊõÐÔÎÊÌ⣬»áºÜ¿ì±»ÐÞ¸´£¬WebSocketºÜ¿ì¾Í»á³ÉΪ×îÖչ淶¡£Óë´Ëͬʱ£¬¶ÔÓÚÄÇЩ²»Ö§³ÖWebSocketµÄä¯ÀÀÆ÷£¬¿ÉÒÔ½µ¼¶Ê¹Óñ¿·½·¨À´ÊµÏÖ£¬±ÈÈçComet»òÂÖѯ¡£

ºÍ֮ǰµÄ·þÎñÆ÷ÍÆµÄ¼¼ÊõÏà±È£¬WebSocketÓÐמ޴óµÄÓÅÊÆ£¬ÒòΪWebSocketÊÇȫ˫¹¤µÄ£¬¶ø²»ÊÇ»ùÓÚHTTPµÄ£¬Ò»µ©½¨Á¢Á¬½Ó¾Í²»»á¶Ïµô¡£CometËùÃæ¶ÔµÄÏÖʵÎÊÌâ¾ÍÊÇHTTPµÄÌå»ýÌ«´ó£¬Ã¿¸öÇëÇó¶¼´øÓÐÍêÕûµÄHTTPÍ·ÐÅÏ¢¡£¶øÇÒ°üº¬ºÜ¶àûÓÐÓõÄTCPÎÕÊÖ£¬ÒòΪHTTPÊDZÈTCP¸ü¸ß²ã´ÎµÄÍøÂçЭÒé¡£

ʹÓÃWebSocketʱ£¬Ò»µ©·þÎñÆ÷ºÍ¿Í»§¶ËÖ®¼äÍê³ÉÎÕÊÖ£¬ÐÅÏ¢¾Í¿ÉÒÔ³©Í¨ÎÞ×èµØËæÒâÍùÀ´ÓÚÁ½¶Ë£¬¶ø²»Óø½¼ÓÄÇЩÎÞÓõÄHTTPÍ·ÐÅÏ¢¡£Õ⼫´óµØ½µµÍÁË´ø¿íµÄÕ¼Óã¬Ìá¸ßÁËÐÔÄÜ¡£ÒòΪÁ¬½ÓÒ»Ö±´¦Óڻ״̬£¬·þÎñÆ÷Ò»µ©ÓÐÐÂÊý¾ÝÒª¸üÐÂʱ¾Í¿ÉÒÔÁ¢¼´·¢Ë͸ø¿Í»§¶Ë£¨²»ÐèÒª¿Í»§¶ËÏÈÇëÇ󣬷þÎñÆ÷ÔÙÏìÓ¦ÁË£©¡£ÁíÍ⣬Á¬½ÓÊÇË«¹¤µÄ£¬Òò´Ë¿Í»§¶ËͬÑù¿ÉÒÔ·¢ËÍÊý¾Ý¸ø·þÎñÆ÷£¬µ±È»Ò²²»ÐèÒª¸½´ø¶àÓàµÄHTTPÍ·¡£

ÏÂÃæÕâ¶Î»°³ö×ÔGoogleµÄIan Hickson£¬HTML5¹æ·¶Ð¡×鸺ÔðÈË£¬ËüÊÇÕâÑùÃèÊöWebSocketµÄ£º

½«Ç§×Ö½ÚµÄÊý¾Ý½µÎª2×Ö½Ú¡­¡­²¢½«ÑÓʱ´Ó150ºÁÃ뽵Ϊ50ºÁÃ룬ÕâÖÖÓÅ»¯¿çÔ½Á˲»Ö¹Ò»¸öÁ¿¼¶£¬Êµ¼ÊÉϽöÕâÁ½µãÓÅ»¯¾Í×ãÒÔÈÃGoogleÈ·ÐÅWebSocket»á¸ø²úÆ·´øÀ´·ÇÒ»°ãµÄÓû§ÌåÑé¡£

ÏÖÔÚÎÒÃÇÀ´¿´Ò»Ï¶¼ÓÐÄÄЩä¯ÀÀÆ÷Ö§³ÖWebSocket£º

Chrome >= 4

Safari >= 5

iOS >= 4.2

Firefox >= 4*

Opera >= 11*

¾¡¹ÜFirefoxºÍOperaÒ²¶¼ÊµÏÖÁËWebSocket£¬µ«¿¼Âǵ½WebSocketÈÔÈ»´æÔÚ°²È«Òþ»¼£¬Ä¬Èϲ¢Ã»ÓÐÆôÓÃËü¡£µ«Õâ²»ÊÇʲô´óÎÊÌ⣬»òÐí±¾Êé³ö°æÊ±WebSocketµÄ°²È«ÎÊÌâ¾ÍÒѾ­½â¾öÁË¡£Í¬Ê±ÄãÒ²¿ÉÒÔÔÚÄÇЩ¶ÔWebSocketÖ§³Ö²»ºÃµÄä¯ÀÀÆ÷ÖнøÐнµ¼¶´¦Àí£¬Ê¹ÓÃÖîÈçCometºÍFlashµÄ±¿·½·¨¡£

¼ì²âä¯ÀÀÆ÷ÊÇ·ñÖ§³ÖWebSocketÒ²·Ç³£¼òµ¥¡¢Ö±½Ó£º

var supported = ("WebSocket" in window);
if (supported) alert("WebSockets are supported");

³¤Ô¶À´¿´£¬ä¯ÀÀÆ÷µÄWebSocket API·Ç³£ÇåÎúÇҺϺõÂß¼­¡£¿ÉÒÔʹÓÃWebSocketÀàÀ´ÊµÀý»¯Ò»¸öеÄÌ×½Ó×Ö£¨socket£©£¬ÕâÐèÒª´«Èë·þÎñÆ÷µÄ¶ËµØÖ·£¬ÔÚÕâ¸öÀý×ÓÖÐÊÇws://example.com£º

var socket = new WebSocket("ws://example.com");

È»ºóÎÒÃÇÐèÒª¸øÕâ¸öÌ×½Ó×ÖÌí¼Óʼþ¼àÌý £º

// ½¨Á¢Á¬½Ó
socket.onopen = function(){ /* ... */ }

// ͨ¹ýÁ¬½Ó·¢ËÍÁËһЩÐÂÊý¾Ý
socket.onmessage = function(data){ /* ... */ }

// ¹Ø±ÕÁ¬½Ó
socket.onclose = function(){ /* ... */ }

µ±·þÎñÆ÷·¢ËÍһЩÊý¾Ýʱ£¬¾Í»á´¥·¢onmessageʼþ£¬Í¬Ñù£¬¿Í»§¶ËÒ²¿ÉÒÔµ÷ÓÃsend()

º¯Êý½«Êý¾Ý´«»Ø·þÎñÆ÷¡£ºÜÃ÷ÏÔ£¬ÎÒÃÇÓ¦µ±ÔÚÁ¬½Ó½¨Á¢ÇÒ´¥·¢ÁËonopenʼþÖ®ºóµ÷ÓÃËü£º

socket.onmessage = function(msg){
console.log("New data - ", msg);
};

socket.onopen = function(){
socket.send("Why, hello there").
};

·¢ËͺͽÓÊÕµÄÏûÏ¢Ö»Ö§³Ö×Ö·û´®¸ñʽ¡£µ«ÔÚ×Ö·û´®ºÍJSONÊý¾ÝÖ®¼ä¿ÉÒÔºÜÇáËɵØÏ໥ת»»£¬ÕâÑù¾Í¿ÉÒÔ´´½¨Äã×Ô¼ºµÄЭÒ飺

var rpc = {
test: function(arg1, arg2) { /* ... */ }
};

socket.onmessage = function(data){
// ½âÎö JSON
var msg = JSON.parse(data);

// µ÷Óà RPC º¯Êý
rpc[msg.method].apply(rpc, msg.args);
};

Õâ¶Î´úÂëÖУ¬ÎÒÃÇ´´½¨ÁËÒ»¸öÔ¶³Ì¹ý³Ìµ÷Óã¨remote procedure call£¬RPC£©½Å±¾£¬·þÎñÆ÷¿ÉÒÔ·¢ËÍһЩ¼òµ¥µÄJSONÀ´µ÷Óÿͻ§¶ËµÄº¯Êý£¬¾ÍÏñÏÂÃæÕâÐдúÂ룺

{"method": "test", "args": [1, 2]}

×¢Ò⣬ÕâÀïµÄµ÷ÓÃÊÇÏÞÖÆÔÚrpc¶ÔÏóÀïµÄ¡£ÕâÑù×öµÄÔ­ÒòÖ÷ÒªÊdzöÓÚ°²È«¿¼ÂÇ£¬Èç¹ûÔÊÐíÔÚ¿Í»§¶ËÖ´ÐÐÈÎÒâJavaScript´úÂ룬ºÚ¿Í¾Í»áÀûÓÃÕâ¸ö©¶´¡£¿ÉÒÔµ÷ÓÃclose()º¯ÊýÀ´¹Ø±ÕÕâ¸öÁ¬½Ó£º

var socket = new WebSocket("ws://localhost:8000/server");

Äã¿Ï¶¨×¢Òâµ½ÁËÎÒÃÇÔÚʵÀý»¯Ò»¸öWebSocketµÄʱºòʹÓÃÁËWebSocketÌØÓеÄЭÒéǰ׺ws://£¬¶ø²»ÊÇhttp://¡£WebSocketͬÑùÖ§³Ö¼ÓÃܵÄÁ¬½Ó£¬ÕâÐèҪʹÓÃÒÔwss://ΪЭÒéǰ׺µÄTLS¡£Ä¬ÈÏÇé¿öÏÂWebSocketʹÓÃ80¶Ë¿Ú½¨Á¢·Ç¼ÓÃܵÄÁ¬½Ó£¬Ê¹ÓÃ443¶Ë¿Ú½¨Á¢¼ÓÃܵÄÁ¬½Ó¡£Äã¿ÉÒÔͨ¹ý¸øURL´øÉÏ×Ô¶¨Òå¶Ë¿ÚÀ´¸²¸ÇĬÈÏÅäÖá£Òª¼Çס£¬²¢²»ÊÇËùÓеĶ˿ڶ¼¿ÉÒÔ±»¿Í»§¶ËʹÓã¬Ò»Ð©·Ç³£¹æµÄ¶Ë¿ÚºÜÈÝÒ×±»·À»ðǽÀ¹½Ø¡£

˵µ½ÏÖÔÚ£¬Äã»òÐí»áÏ룬¡°ÎÒ»¹²»ÄÜÔÚÏîÄ¿ÖÐʹÓÃWebSocket£¬ÒòΪ±ê×¼»¹Î´³ÉÐÍ£¬¶øÇÒIE²»Ö§³ÖWebSocket¡±¡£ÕâÑùµÄÏë·¨²¢Ã»ÓÐ´í£¬ÐÒÔ˵ÄÊÇ£¬ÎÒÃÇÓнâ¾ö·½°¸¡£Web-socket-js£¨https://github.com/gimite/web-socket-js£©ÊÇÒ»¸ö»ùÓÚAdobeFlashʵÏÖµÄWebSocket¡£ÓÃÕâ¸ö¿â¾Í¿ÉÒÔÔÚ²»Ö§³ÖWebSocketµÄä¯ÀÀÆ÷ÖÐ×öÓÅÑŽµ¼¶¡£±Ï¾¹¼¸ºõËùÓеÄä¯ÀÀÆ÷¶¼°²×°ÁËFlash²å¼þ¡£»ùÓÚFlashʵÏÖµÄSocketAPIºÍHTML5±ê×¼¹æ·¶ÍêȫһÑù£¬Òò´Ëµ±WebSocketµÄä¯ÀÀÆ÷¼æÈÝÐÔ¸üºÃµÄʱºò£¬Ö»Ðè¼òµ¥µØ½«¿âÒÆ³ý¼´¿É£¬¶ø²»±Ø¶Ô´úÂë×öÈκÎÐ޸ġ£

¾¡¹Ü¿Í»§¶ËµÄAPI·Ç³£¼ò½à¡¢Ö±½Ó£¬µ«ÔÚ·þÎñÆ÷¶ËÇé¿ö¾Í²»Í¬ÁË¡£WebSocketЭÒé°üº¬Á½¸ö»¥²»¼æÈݵIJݰ¸Ð­Ò飺²Ý°¸75£¨http://goo.gl/cgSjp£©ºÍ²Ý°¸76£¨http://goo.gl/2u78y£©¡£·þÎñÆ÷ÐèҪͨ¹ý¼ì²â¿Í»§¶ËʹÓõÄÁ¬½ÓÎÕÊÖÀàÐÍÀ´ÅжÏʹÓÃÄĸö²Ý°¸Ð­Òé¡£

WebSocketÊ×ÏÈÏò·þÎñÆ÷·¢ÆðÒ»¸öHTTP¡°Éý¼¶¡±£¨upgrade£©ÇëÇó¡£Èç¹ûÄãµÄ·þÎñÆ÷Ö§³ÖWebSocket£¬Ôò»áÖ´ÐÐWebSocketÎÕÊÖ²¢³õʼ»¯Ò»¸öÁ¬½Ó¡£¡°Éý¼¶¡±ÇëÇóÖаüº¬ÁËԭʼÓò£¨ÇëÇóËù·¢³öµÄÓòÃû£©µÄÐÅÏ¢¡£¿Í»§¶Ë¿ÉÒÔºÍÈÎÒâÓòÃû½¨Á¢WebSocketÁ¬½Ó£¬Ö»ÓзþÎñÆ÷²Å»á¾ö¶¨ÄÄЩ¿Í»§¶Ë¿ÉÒÔºÍËü½¨Á¢Á¬½Ó£¬³£ÓÃ×ö·¨Êǽ«ÔÊÐíÁ¬½ÓµÄÓòÃû×ö³É°×Ãûµ¥¡£

ÔÚWebSocketµÄÉè¼ÆÖ®³õ£¬Éè¼ÆÕßÃÇÏ£ÍûÖ»Òª³õʼÁ¬½ÓʹÓÃÁ˳£ÓõĶ˿ںÍHTTPÍ·×ֶΣ¬¾Í¿ÉÒԺͷÀ»ðǽºÍ´úÀíÈí¼þºÍгÏà´¦¡£È»¶øÀíÏëÊÇ·áÂúµÄ£¬ÏÖʵÊǹǸеġ£ÓÐЩ´úÀíÈí¼þ¶ÔWebSocketµÄ¡°Éý¼¶¡±ÇëÇóµÄÍ·ÐÅÏ¢×öÁËÐ޸쬴òÆÆÁËЭÒ鹿Ôò¡£ÊÂʵÉÏ£¬Ð­Òé²Ý°¸µÄ×î½üÒ»´Î¸üУ¨°æ±¾76£©Ò²ÎÞÒâÖдòÆÆÁ˶Է´Ïò´úÀíºÍÍø¹ØµÄ¼æÈÝÐÔ¡£ÎªÁ˸üºÃ¸ü³É¹¦µØÊ¹ÓÃWebSocket£¬ÕâÀï¸ø³öһЩ²½Ö裺

ʹÓð²È«µÄWebSocketÁ¬½Ó£¨wss£©¡£´úÀíÈí¼þ²»»á¶Ô¼ÓÃܵÄÁ¬½ÓºúÂҴ۸쬴ËÍâÄãËù·¢Ë͵ÄÊý¾Ý¶¼ÊǼÓÃܺóµÄ£¬²»ÈÝÒ×±»ËûÈËÇÔÈ¡¡£

ÔÚWebSocket·þÎñÆ÷Ç°ÃæÊ¹ÓÃTCP¸ºÔؾùºâÆ÷£¬¶ø²»ÒªÊ¹ÓÃHTTP¸ºÔؾùºâÆ÷£¬³ý·Çij¸öHTTP¸ºÔؾùºâÆ÷´óËÁÐûÑï×Ô¼ºÖ§³ÖWebSocket¡£

²»Òª¼ÙÉèä¯ÀÀÆ÷Ö§³ÖWebSocket£¬ËäÈ»ä¯ÀÀÆ÷Ö§³ÖWebSocketÖ»ÊÇʱ¼äÎÊÌâ¡£³ÏÈ»£¬Èç¹ûÁ¬½ÓÎÞ·¨¿ìËÙ½¨Á¢£¬ÔòѸËÙÓÅÑŽµ¼¶Ê¹ÓÃCometºÍÂÖѯµÄ·½Ê½À´´¦Àí¡£

ÄÇô£¬ÈçºÎÑ¡Ôñ·þÎñÆ÷¶ËµÄ½â¾ö·½°¸ÄØ£¿ÐÒÔ˵ÄÊÇ£¬ÔںܶàÓïÑÔÖж¼ÊµÏÖÁ˶ÔWebSocketµÄÖ§³Ö£¬±ÈÈçRuby¡¢PythonºÍJava¡£ÒªÔÙ´ÎÈ·ÈÏÿ¸öʵÏÖÊÇ·ñÖ§³Ö×îеÄ76°æÐ­Òé²Ý°¸£¬ÒòΪÕâ¸öЭÒéÊDZ»´ó¶àÊý¿Í»§¶ËËùÖ§³ÖµÄ¡£

Node.js
©¤ node-Websocket-server£¨http://github.com/miksago/node-websocket-server£©
©¤ Socket.IO£¨http://socket.io£©

Ruby

EventMachine£¨http://github.com/igrigorik/em-websocket£©
Cramp£¨https://github.com/lifo/cramp£©
Sunshowers£¨http://rainbows.rubyforge.org/sunshowers/£©
Python
Twisted£¨http://github.com/rlotun/txWebSocket£©
Apache module£¨http://code.google.com/p/pywebsocket£©
PHP
php-Websocket£¨http://github.com/nicokaiser/php-websocket£©
Java
Jetty£¨http://www.eclipse.org/jetty£©
Google Go
native£¨http://code.google.com/p/go£©

Èý¡¢Node.jsºÍSocket.IO

ÔÚÉÏÃæµÄÃûµ¥ÖУ¬Node.js£¨http://nodejs.org£©ÊÇÒ»ÃûгÉÔ±£¬Ò²Êǵ±ÏÂ×îÊܹØ×¢µÄм¼Êõ¡£Node.jsÊÇ»ùÓÚʼþÇý¶¯µÄJavaScript·þÎñÆ÷£¬²ÉÓÃÁËGoogleµÄV8ÒýÇæ£¨http://code.google.com/p/v8£©¡£ÕýÒòΪ´Ë£¬Node.jsËٶȷdz£¿ì£¬Ò²¿ÉÒÔ½â¾ö·þÎñÆ÷¸ß²¢·¢Á¬½ÓÊýµÄ×ÊÔ´ÏûºÄÎÊÌ⣬ºÍWebSocket·þÎñÆ÷Ò»Ñù¡£

Socket.IO£¨http://socket.io/£©ÊÇÒ»¸öNode.js¿â£¬ÊµÏÖÁËWebSocket¡£×îÈÃÈ˸ÐÐËȤµÄ²»Ö¹ÓÚ´Ë£¬À´¿´Ò»¶Î¹ÙÍøÉϵÄÐû´«ÎÄ×Ö£º

Socket.IOµÄÄ¿±êÊÇÔÚÿ¸öä¯ÀÀÆ÷ºÍÒÆ¶¯É豸Öй¹½¨ÊµÊ±APP£¬ÕâËõСÁ˶àÖÖ´«Êä»úÖÆÖ®¼äµÄ²îÒì¡£

Èç¹û»·¾³Ö§³ÖWebSocket£¬ÄÇôSocket.IO¾Í»á³¢ÊÔʹÓÃWebSocket£¬ÈôÓбØÒªÒ²»á½µ¼¶Ê¹ÓÃÆäËûµÄ´«Ê䷽ʽ¡£ÕâÀïÁгöÁËËùÖ§³ÖµÄ´«Ê䷽ʽ£¬·Ç³£È«Ã棬Òò´ËWebSocket.IO¿ÉÒÔ×öµ½¸üºÃµÄä¯ÀÀÆ÷¼æÈÝ£º

WebSocket

Adobe Flash Socket

ActiveX HTMLFile (IE)

»ùÓÚ multipart ±àÂë·¢ËÍ XHR£¨XHR with multipart encoding£©

»ùÓÚ³¤ÂÖѯµÄXHR

JSONP ÂÖѯ£¨ÓÃÓÚ¿çÓòµÄ³¡¾°£©

Socket.IO µÄä¯ÀÀÆ÷Ö§³Ö·Ç³£È«Ãæ¡£¡°·þÎñÆ÷ÍÆ¡±µÄʵÏÖÊÇÖÚËùÖÜÖªµÄÄÑÌ⣬µ«Socket.IOÍŶÓΪÄã½â¾öÁËÕâЩ·³ÄÕ£¬Socket.IO±£Ö¤ÁËËüÄܼæÈÝ´ó¶àÊýä¯ÀÀÆ÷£¬ä¯ÀÀÆ÷Ö§³ÖÇé¿öÈçÏ£º

Safari >= 4

Chrome >= 5

IE >= 6

iOS

Firefox >= 3

Opera >= 10.61

¾¡¹ÜÔÚ·þÎñÆ÷¶ËʵÏÖµÄSocket.IO×î³õÊÇ»ùÓÚNode.jsµÄ£¬ÏÖÔÚÒ²ÓÐÓÃÆäËûÓïÑÔʵÏֵİ汾ÁË£¬±ÈÈçRuby£¨Rack£©£¨http://github.com/markjeee/Socket.IQ-rack£©£¬Python£¨Tornado£©

£¨https://github.com/MrJoes/tornadio£©£¬Java£¨http://code.google.com/p/socketio-java£©ºÍ

GoogleGo£¨http://github.com/madari/go-socket.io£©¡£

À´¿´Ò»ÏÂËüµÄAPI£¬Ð´·¨·Ç³£¼òµ¥¡¢Ö±½Ó£¬¿Í»§¶ËµÄAPIºÍWebSocketµÄAPI¿´ÆðÀ´ºÜÏñ£º

var socket = new io.Socket();

socket.on("connect", function(){
socket.send('hi!');
});

socket.on("message", function(data){
alert(data);
});

socket.on("disconnect", function(){});

ÔÚºǫ́Socket.IO»áÑ¡ÔñʹÓÃ×î¼ÑµÄ´«Ê䷽ʽ¡£ÕýÈçÔÚreadmeÎļþÖÐËùÃèÊöµÄ£¬¡°Äã¿ÉÒÔʹÓÃSocket.IOÔÚÈκεط½¹¹½¨ÊµÊ±APP¡±¡£

Èç¹ûÄãÏëѰÇó±ÈSocket.IO¸ü¸ß¼¶µÄ½â¾ö·½°¸£¬¿ÉÒÔ¹Ø×¢Ò»ÏÂJuggernaut£¨http://github.com/maccman/juggernaut£©£¬Ëü¾ÍÊÇ»ùÓÚSocket.IOʵÏֵġ£Juggernaut°üº¬Ò»¸öÐŵÀ½Ó¿Ú£¨channelinterface£©£º¿Í»§¶Ë¿ÉÒÔ¶©ÔÄÐŵÀ¼àÌý£¬·þÎñÆ÷¶Ë¿ÉÒÔÏòÐŵÀ·¢²¼ÏûÏ¢£¬¼´ËùνµÄ¶©ÔÄ/·¢²¼£¨http://en.wikipedia.org/wiki/PubSub£©Ä£Ê½¡£Õâ¸ö¿â¿ÉÒÔÕë¶Ô²»Í¬µÄ¿Í»§¶ËºÍʵÏÖ»·¾³×÷Áé»îÀ©Õ¹£¬±ÈÈç»ùÓÚTLSµÈ¡£

Èç¹ûÄãÐèÒªÐéÄâÖ÷»úÖеĽâ¾ö·½°¸£¬¿ÉÒԲο¼Pusher£¨http://pusherapp.com/£©¡£Pusher¿ÉÒÔÈÃÄã´Ó·±ÔӵķþÎñÆ÷¹ÜÀíÊÂÎñÖгéÉí³öÀ´£¬Ê¹ÄãÄܽ«×¢ÒâÁ¦¼¯ÖÐÔÚÓÐÒâÒåµÄ²¿·Ö£ºWebÓ¦ÓõĿª·¢¡£¿Í»§¶ËµÄʵÏַdz£¼òµ¥£¬Ö»Ð轫JavaScriptÎļþÒýÈëÒ³ÃæÖв¢¶©ÔÄÐŵÀ¼àÌý¼´¿É¡£µ±ÓÐÏûÏ¢·¢²¼µÄʱºò£¬½ö½öÊÇ·¢ËÍÒ»¸öHTTPÇëÇóµ½RESTAPI£¨http://pusherapp.com/docs£©¡£

ËÄ¡¢ÊµÊ±¼Ü¹¹

½«Êý¾Ý´Ó·þÎñÆ÷ÍÆË͸ø¿Í»§¶ËµÄÀíÂÛ¿´ÆðÀ´ÓеãÖ½ÉÏ̸±ø£¬ÈçºÎ½«ÀíÂÛºÍJavaScriptÓ¦ÓõĿª·¢Êµ¼ùÏà½áºÏÄØ£¿Èç¹ûÄãµÄÓ¦ÓÃÕýÈ·µØ»®·Ö³öÁËÄ£ÐÍ£¬ÄÇôӦÓÃʵʱ¼Ü¹¹½«»á·Ç³£¼òµ¥¡£½ÓÏÂÀ´ÎÒÃǸø³öÔÚÓ¦ÓÃÖй¹½¨ÊµÊ±¼Ü¹¹µÄÿ¸ö²½Ö裬ÕâÀï´óÁ¿Óõ½Á˶©ÔÄ/·¢²¼Ä£Ê½¡£Ê×ÏÈÐèÒªÁ˽âµÄÊǽ«¸üÐÂ֪ͨµ½¿Í»§¶ËµÄÕû¸ö¹ý³Ì¡£

ʵʱ¼Ü¹¹ÊÇ»ùÓÚʼþÇý¶¯µÄ£¨event-driven£©¡£Ê¼þÍùÍùÊÇÓÉÓû§½»»¥´¥·¢µÄ£ºÓû§ÐÞ¸ÄÁËÊý¾Ý¼Ç¼£¬Ê¼þ¾Í»á´«²¥¸øÏµÍ³£¬Ö±µ½Êý¾ÝÍÆË͸øÒѾ­½¨Á¢Á¬½ÓµÄ¿Í»§¶Ë²¢¸üÐÂÊý¾Ý¡£ÒªÏëΪÄãµÄÓ¦Óù¹½¨ÊµÊ±¼Ü¹¹£¬ÔòÐèÒª¿¼ÂÇÁ½¼þÊ£º

ÄĸöÄ£ÐÍÐèÒªÊÇʵʱµÄ£¿

µ±Ä£ÐÍʵÀý·¢Éú¸Ä±äʱ£¬ÐèҪ֪ͨÄÄЩÓû§£¿

ʵ¼ÊÇé¿öÍùÍùÊǵ±Ä£ÐÍ·¢Éú¸Ä±äʱ£¬ÄãÏ£Íû¸øËùÓн¨Á¢Á¬½ÓµÄ¿Í»§¶Ë·¢ËÍ֪ͨ¡£ÕâÖÖÇé¿ö¸ü¶à·¢ÉúÔÚÍøÕ¾Ê×Ò³ÐèҪʵʱÌṩ»î¶¯µÄÊý¾ÝÔ´µÄ³¡¾°ÖУ¬±ÈÈ磬ÿ¸ö¿Í»§¶Ë¶¼ÄÜ¿´µ½ÏàͬµÄÐÅÏ¢¡£È»¶ø¸ü¶àµÄÓ¦Óó¡¾°ÊÇ£¬ÒªÏëÕë¶Ô²»Í¬µÄÓû§Èº·¢ËͲ»Í¬µÄÊý¾ÝÔ´£¬ÄãÐèÒª¸ù¾Ý²»Í¬ÀàÐ͵ÄÊý¾ÝÔ´ÓÐÕë¶ÔÐԵظøÓû§ÍÆË͸üС£

ÎÒÃÇÀ´¿´Ò»¸öÁÄÌìÊҵij¡¾°£º

1£®Óû§ÔÚÁÄÌìÊÒÖз¢ËÍÁËÒ»¸öÐÂÏûÏ¢¡£

2£®¿Í»§¶ËÏò·þÎñÆ÷·¢ËÍÒ»ÌõAJAXÇëÇ󣬲¢´´½¨Ò»ÌõChat¼Ç¼¡£

3£®ÔÚChatÄ£ÐÍÉÏ´¥·¢ÁË¡°±£´æ¡±µÄ»Øµ÷£¬µ÷ÓÃÎÒÃǵķ½·¨À´¸üпͻ§¶ËÊý¾Ý¡£

4£®²éÕÒÁÄÌìÊÒÖÐËùÓкÍÕâ¸öChat¼Ç¼ÓйصÄÓû§£¬ÎÒÃÇÐèÒª¸øÕâЩÓû§·¢Ë͸üÐÂ֪ͨ¡£

5£®ÓÃÒ»Ìõ¸üÐÂÀ´ÃèÊö·¢ÉúÁËʲôÊÂÇ飨´´½¨Chat¼Ç¼£©£¬½«Õâ¸ö¸üÐÂÍÆË͸øÏà¹ØµÄÓû§¡£

Õâ¸ö¹ý³ÌµÄϸ½ÚºÍÄãÑ¡ÓõķþÎñÆ÷»·¾³Óйأ¬È»¶ø£¬Èç¹ûÄãʹÓÃRails£¬Holla£¨http://github.com/maccman/holla£©ÊÇÒ»¸ö·Ç³£²»´íµÄÀý×Ó¡£µ±´´½¨ÁËMessage¼Ç¼ʱ£¬JuggernautObserver»á¸üÐÂÏà¹ØµÄ¿Í»§¶Ë¡£

ÏÖÔÚ¾ÍÒýÈëÁËÁíÍâÒ»¸öÎÊÌ⣺ÈçºÎÏòÌØ¶¨Óû§·¢ËÍ֪ͨ£¿×î¼Ñ·½·¨ÊÇʹÓ÷¢²¼/¶©ÔÄģʽ£º¿Í»§¶Ë¶©ÔÄij¸öÌØ¶¨µÄÐŵÀ£¬·þÎñÆ÷ÏòÕâ¸öÐŵÀ·¢²¼ÏûÏ¢¡£Ã¿¸öÓû§¶©ÔÄΨһµÄÐŵÀ£¬ÐŵÀ°üº¬Ò»¸öID£¬¿ÉÄÜÊÇÓû§ÔÚÊý¾Ý¿âÖдæ·ÅµÄID¡£È»ºó£¬·þÎñÆ÷Ö»ÐèÏòÕâ¸öΨһµÄÐŵÀ·¢²¼ÏûÏ¢¼´¿É£¬ÕâÑù¾Í¿ÉÒÔ×öµ½½«Í¨Öª·¢Ë͸øÌض¨µÄÓû§¡£

ÀýÈ磬ij¸öÓû§¿ÉÒÔ¶©ÔÄÏÂÃæÕâ¸öÐŵÀ£º

/observer/0765F0ED-96E6-476D-B82D-8EBDA33F4EC4

ÕâÀïµÄËæ»ú×Ö·û´®Êǵ±Ç°µÇ¼Óû§Î¨Ò»µÄ±êʶ¡£ÒªÏ뽫֪ͨ·¢Ë͸øÕâ¸öÌØ¶¨Óû§£¬·þÎñÆ÷Ö»ÐèÏòͬһ¸öÐŵÀ·¢²¼ÏûÏ¢¼´¿É¡£

Äã¿ÉÄܺÜÏëÖªµÀ·¢²¼/¶©ÔÄģʽÔÚÐÅÏ¢´«Êä¹ý³Ì£¨WebSocket»òComet£©ÖÐÊÇÔõÑù¹¤×÷µÄ¡£ÐÒÔ˵ÄÊÇ£¬ÒѾ­Óкܶà¿ÉÓõĽâ¾ö·½°¸£¬±ÈÈçJuggernautºÍPusher£¬Ö®Ç°¶¼ÓÐÌáµ½¹ý¡£·¢²¼/¶©ÔÄÊÇ×î³£¼ûµÄ³éÏ󣬴¦ÓÚWebSocketµÄ×î¸ß²ã£¬²»¹ÜÄãÑ¡ÓÃʲô·þÎñ»ò¿â£¬ËüÃǵÄAPI¶¼·Ç³£ÏàËÆ¡£

Ò»µ©·þÎñÆ÷½«Í¨ÖªÍÆË͸ø¿Í»§¶Ë£¬Ä㽫Ìå»áµ½MVC¼Ü¹¹´øÀ´µÄÃÀ¸Ð¡£ÈÃÎÒÃǻعýÍ·À´¿´¸Õ²ÅµÄÁÄÌìÊÒµÄÀý×Ó¡£·¢Ë͸ø¿Í»§¶ËµÄ֪ͨ¸ñʽ¿´ÆðÀ´ÏñÕâÑù£º

{
"klass":"Chat", "type": "create", "id": "3",
"record": {"body": "New chat"}
}

Ëü°üº¬Ò»¸ö±»¸ü¸ÄµÄÄ£ÐÍ¡¢¸üÐÂÀàÐÍºÍÆäËûÏà¹ØÊôÐÔ¡£Ê¹ÓÃËü¿ÉÒÔÈÿͻ§¶ËÔÚ±¾µØ´´½¨ÐµÄChat¼Ç¼¡£ÓÉÓÚ¿Í»§¶ËµÄÄ£ÐÍÒѾ­°ó¶¨ÁËUI£¬Òò´ËÓû§½çÃæ»á¸ù¾ÝеÄÁÄÌì¼Ç¼×Ô¶¯¸üС£

×îÈÃÈ˳ԾªÖ®´¦ÔÚÓÚÕâ¸ö¹ý³Ì²¢²»ºÍÌØ¶¨µÄChatÄ£ÐÍÏà¹Ø£¬Èç¹ûÎÒÃÇÏë´´½¨ÁíÒ»¸öʵʱģÐÍ£¬Ö»ÐèÌí¼ÓÁíÍâÒ»¸ö·þÎñÆ÷¹Û²ìÕߣ¬È·±£·þÎñÆ÷¸üÐÂʱ¿Í»§¶Ë»áËæÖ®¸üм´¿É¡£ÏÖÔÚÎÒÃǵĺǫ́ºÍ¿Í»§¶ËÄ£ÐͰó¶¨ÔÚÒ»Æð¡£Èκκǫ́ģÐ͵ĸü¸Ä¶¼»á×Ô¶¯´«²¥¸øÏà¹ØµÄ¿Í»§¶Ë£¬²¢¸üÐÂUI¡£Ê¹ÓÃÕâÖּܹ¹´î½¨µÄÓ¦ÓþÍÊÇÕæÕýµÄʵʱӦÓá£Ò»¸öÓû§ºÍÓ¦ÓòúÉúµÄÈκν»»¥¼´¿Ì±»¹ã²¥¸øÆäËûµÄÓû§¡£

Îå¡¢¸ÐÖªËÙ¶È

ËÙ¶ÈÊÇUIÉè¼Æ×îÖØÒªÒ²ÊÇ×îÒ׺öÂÔµÄÎÊÌ⣬ËٶȶÔÓû§ÌåÑ飨UX£©µÄÓ°Ïì·Ç³£´ó£¬²¢Ö±½ÓÓ°ÏìÍøÕ¾µÄÊÕÒæ¡£ºÜ¶à´ó¹«Ë¾Ò»Ö±¶¼ÔÚÑо¿¡¢µ÷²éËٶȺÍÍøÕ¾ÊÕÒæÖ®¼äµÄ¹ØÏµ£º

Amazon

Ò³Ãæ¼ÓÔØÊ±¼äÿÔö¼Ó100ºÁÃ룬¾Í»áÔì³É1%µÄÏúÊÛËðʧ£¨À´Ô´£ºGregLinden,Amazon£©¡£

Google

Ò³Ãæ¼ÓÔØÊ±¼äÿÔö¼Ó500ºÁÃ룬¾Í»áÔì³É20%µÄÁ÷Á¿Ëðʧ£¨À´Ô´£ºMarrissa Mayer£¬Google£©¡£

Yahoo!

Ò³Ãæ¼ÓÔØÊ±¼äÿÔö¼Ó400ºÁÃ룬ÔÚÒ³Ãæ¼ÓÔØÍê³É֮ǰ¾Íµ¥»÷¡°ºóÍË¡±°´Å¥µÄÈË»áÔö¼Ó5%¡«9%£¨À´Ô´£ºNicole Sullivan, Yahoo!£©¡£

¡°¸ÐÖªËÙ¶È¡±£¨perceived speed£©ºÍÕæÊµµÄËÙ¶ÈͬµÈÖØÒª£¬ÒòΪ¸ÐÖªËٶȹØÏµµ½Óû§µÄ¸Ð¹ÙÌåÑé¡£Òò´Ë£¬¹Ø¼üÊÇÒªÈÃÓû§¡°¸Ð¾õ¡±µ½ÄãµÄÓ¦Óúܿ죬¾¡¹Üʵ¼ÊµÄËÙ¶È¿ÉÄܲ¢²»¿ì£¬¶øÕâÕýÊÇJavaScriptÓ¦Óôø¸øÎÒÃǵÄ×î´óºÃ´¦£º¾¡¹Üijһʱ¿ÌÔÚºǫ́»áÓкܶàÇëÇ󲻻ἰʱÏìÓ¦£¬µ«UI²»»á±»×èÈû¡£

ÈÃÎÒÃÇÔٴλعýÍ·À´ÌÖÂÛ¸Õ²ÅÁÄÌìÊҵij¡¾°¡£Óû§·¢ËÍÁËеÄÏûÏ¢£¬´¥·¢ÁËÒ»¸öAJAXÇëÇó¡£ÎÒÃÇ¿ÉÒԵȴýÕâ¸öÇëÇóÔÚÍøÂçÖÐ×ßÒ»¸öÀ´»ØÖ®ºó£¬½«ÏìÓ¦½á¹û¸üе½ÁÄÌì¼Ç¼ÖС£È»¶ø£¬´Ó·¢ÆðÇëÇóµÄʱ¿Ì¿ªÊ¼£¬µ½»ñµÃÏìÓ¦²¢¸üÐÂÖÁÁÄÌì¼Ç¼£¬»áÓм¸ÃëÖÓµÄÑÓʱ¡£Õâ»áÈÃÓ¦Óÿ´ÆðÀ´ºÜÂý£¬¿Ï¶¨»áÔì³ÉÓû§ÌåÑéÉϵÄËðʧ¡£

¼ÈÈ»Èç´Ë£¬ÎªÊ²Ã´²»Ö±½ÓÔÚ±¾µØ´´½¨Ò»¸öмÇÂ¼ÄØ£¿Ö»Ð轫ÏûÏ¢Á¢¼´Ìí¼ÓÖÁÁÄÌì¼Ç¼Öм´¿É¡£Óû§»á¸ÐÖªµ½Õâ¸öÏûÏ¢±»Á¢¼´·¢ËͳöÈ¥ÁË£¬ËûÃDz»ÖªµÀ£¨ÉõÖÁ²»¹ØÐÄ£©Õâ¸öÏûÏ¢ÊÇ·ñ±»·Ö·¢¸øÁËÁÄÌìÊÒÖеÄËùÓÐÈË¡£Ö»ÓÐÕâÖÖÇ峺¡¢Á÷³©µÄ²úÆ·ÌåÑ飬²Å»áÈÃÓû§±¶¸ÐÓäÔá£

³ýÁ˽»»¥Éè¼ÆµÄСÇÏÃÅÖ®Í⣬WebÓ¦ÓÃÖÐ×îºÄʱµÄ²¿·ÖÊÇÐÂÊý¾ÝµÄ¼ÓÔØ¡£×îÃ÷ÖǵÄ×ö·¨ÊÇÔÚÓû§ÇëÇóÊý¾Ý֮ǰԤ²âÓû§µÄÐÐΪ²¢Ô¤¼ÓÔØÊý¾Ý£¬ÕâÒ»µã·Ç³£ÖØÒª¡£Ô¤¼ÓÔØµÄÊý¾Ý±»»º´æÔÚÄÚ´æÖУ¬Èç¹ûËæºóÓû§ÐèÒªÕâ¸öÊý¾Ý£¬¾Í²»±ØÔÙ·¢Æðµ½·þÎñÆ÷µÄÇëÇóÁË¡£Ó¦ÓÃÔÚÆô¶¯ÒÁʼ¾ÍÓ¦µ±Ô¤¼ÓÔØ³£ÓõÄÊý¾Ý¡£Ó¦ÓüÓÔØÊ±µÄÂÔ΢ÑÓʱ»òÐí¿ÉÈÌ£¬¶ø¼ÓÔØÍê³ÉºóÔã¸âµÄ½»»¥ÌåÑé¶Ï²»¿ÉÈÌ¡£

µ±Óû§ºÍÄãµÄÓ¦ÓòúÉú½»»¥Ê±£¬ÄãÐèÒªÊÊʱ¸øÓû§Ò»Ð©·´À¡£¬Í¨³£Ê¹ÓÃһЩ¿ÉÊÓ»¯µÄ½ø

¶ÈָʾÀ´¸ø³ö·´À¡¡£ÓÃÐÐÒµÊõÓïÀ´½²¾ÍÊÇ¡°ÆÚÍû¹ÜÀí¡±£¨expectationmanagment£©¡ª¡ªÒªÈÃÓû§ÖªµÀµ±Ç°ÏîÄ¿µÄ״̬ºÍ¹À¼ÆÍê³Éʱ¼ä¡£¡°ÆÚÍû¹ÜÀí¡±Í¬ÑùÊÊÓÃÓÚÓû§ÌåÑéÁìÓò£¬ÊÊʱµØ¸øÓû§Ò»Ð©·´À¡£¬¸æÖªÓû§·¢ÉúÁËʲôÊÂÇ飬»áÈÃÓû§¸üÓÐÄÍÐĵȴý³ÌÐòµÄÔËÐС£µ±Óû§µÈ´ýÐÂÊý¾ÝµÄ¼ÓÔØÊ±×îºÃ¸ø³öÐÅÏ¢Ìáʾ»òÒ»ÕÅÐýתµÄСͼƬ¡£Èç¹ûÔÚÉÏ´«Îļþ£¬Ôò¸ø³öÉÏ´«½ø¶ÈÌõ¼°¹À¼ÆÍê³Éʱ¼ä¡£ÕâЩ¶¼ÊôÓÚ¸ÐÖªËٶȵķ¶³ë£¬¿ÉÓÐЧµØÌáÉý²úÆ·µÄÓû§ÌåÑé¡£

 

   
1909 ´Îä¯ÀÀ       27
Ïà¹ØÎÄÕÂ

¹È¸è½ÌÄãÈçºÎ¹¹½¨Ò»¸öÓÅÐãµÄÒÆ¶¯ÍøÕ¾
ÈçºÎ¸ßЧµØ¹ÜÀíÍøÕ¾¾²Ì¬×ÊÔ´
¸ßÐÔÄÜÍøÕ¾½¨ÉèµÄ×î¼Ñʵ¼ù
Ïл°ÍøÕ¾×ó²àµ¼º½µÄʵÏÖ
 
Ïà¹ØÎĵµ

ÍøÕ¾½¨Éè·½°¸Á÷³Ì
ÍøÕ¾½¨Éècss½Ì³Ì
ÆóÒµÍøÕ¾½¨ÉèÓëÍÆ¹ã
ÍøÕ¾½¨Éè·½°¸Êé
Ïà¹Ø¿Î³Ì

Éè¼ÆÄ£Ê½Ô­ÀíÓëÓ¦ÓÃ
´ÓÐèÇó¹ý¶Éµ½Éè¼Æ
Èí¼þÉè¼ÆÔ­ÀíÓëʵ¼ù
ÈçºÎ±àд¸ßÖÊÁ¿´úÂë
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]

Ê®Ììѧ»áDIV+CSS(WEB±ê×¼)
HTML 5µÄ¸ïУº½á¹¹Ö®ÃÀ
½éÉÜ27¿î¾­µäµÄCSS¿ò¼Ü
35¸öÓд´ÒâµÄ404´íÎóÒ³Ãæ
×îÈÝÒ×·¸µÄ13¸öJavaScript´íÎó
Éè¼ÆÒ×Àí½âºÍ²Ù×÷µÄÍøÕ¾

Éè¼ÆÄ£Ê½Ô­ÀíÓëÓ¦ÓÃ
´ÓÐèÇó¹ý¶Éµ½Éè¼Æ
Èí¼þÉè¼ÆÔ­ÀíÓëʵ¼ù
ÈçºÎ±àд¸ßÖÊÁ¿´úÂë
µ¥Ôª²âÊÔ¡¢Öع¹¼°³ÖÐø¼¯³É
Èí¼þ¿ª·¢¹ý³ÌÖ¸ÄÏ

¶«Èí¼¯ÍÅ ´úÂëÖØ¹¹
ij½ðÈÚÈí¼þ·þÎñÉÌ ¼¼ÊõÎĵµ
Öдïµçͨ Éè¼ÆÄ£Ê½Ô­ÀíÓëʵ¼ù
·¨¹úµçÐÅ ¼¼ÊõÎĵµ±àдÓë¹ÜÀí
Î÷ÃÅ×Ó Ç¶ÈëʽÉè¼ÆÄ£Ê½
ÖÐд󶫷½ÈËÊÙ ¼¼ÊõÎĵµ±àд