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