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

1Ôª 10Ôª 50Ôª





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



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
WebSocket ½Ì³Ì
 
  2745  次浏览      27
 2017-12-15  
 
±à¼­ÍƼö:
±¾ÎÄÀ´×ÔÓÚÈîÒ»·å,±¾ÎÄÖ÷ÒªÓÃWebSocketµÄÔ­Òò¡¢»ù´¡¡¢Ê¾Àý¡¢ ¿Í»§¶Ë¼°·þÎñ¶ËµÈµÈ·½Ãæ¡£

WebSocket ÊÇÒ»ÖÖÍøÂçͨÐÅЭÒ飬ºÜ¶à¸ß¼¶¹¦Äܶ¼ÐèÒªËü¡£

±¾ÎĽéÉÜ WebSocket ЭÒéµÄʹÓ÷½·¨¡£

Ò»¡¢ÎªÊ²Ã´ÐèÒª WebSocket£¿

³õ´Î½Ó´¥ WebSocket µÄÈË£¬¶¼»áÎÊͬÑùµÄÎÊÌ⣺ÎÒÃÇÒѾ­ÓÐÁË HTTP ЭÒ飬Ϊʲô»¹ÐèÒªÁíÒ»¸öЭÒ飿ËüÄÜ´øÀ´Ê²Ã´ºÃ´¦£¿

´ð°¸ºÜ¼òµ¥£¬ÒòΪ HTTP ЭÒéÓÐÒ»¸öȱÏÝ£ºÍ¨ÐÅÖ»ÄÜÓɿͻ§¶Ë·¢Æð¡£

¾ÙÀýÀ´Ëµ£¬ÎÒÃÇÏëÁ˽â½ñÌìµÄÌìÆø£¬Ö»ÄÜÊǿͻ§¶ËÏò·þÎñÆ÷·¢³öÇëÇ󣬷þÎñÆ÷·µ»Ø²éѯ½á¹û¡£HTTP ЭÒé×ö²»µ½·þÎñÆ÷Ö÷¶¯Ïò¿Í»§¶ËÍÆËÍÐÅÏ¢¡£

ÕâÖÖµ¥ÏòÇëÇóµÄÌØµã£¬×¢¶¨ÁËÈç¹û·þÎñÆ÷ÓÐÁ¬ÐøµÄ״̬±ä»¯£¬¿Í»§¶ËÒª»ñÖª¾Í·Ç³£Âé·³¡£ÎÒÃÇÖ»ÄÜʹÓÃ"ÂÖѯ"£ºÃ¿¸ôÒ»¶Îʱºò£¬¾Í·¢³öÒ»¸öѯÎÊ£¬Á˽â·þÎñÆ÷ÓÐûÓÐеÄÐÅÏ¢¡£×îµäÐ͵ij¡¾°¾ÍÊÇÁÄÌìÊÒ¡£

ÂÖѯµÄЧÂʵͣ¬·Ç³£ÀË·Ñ×ÊÔ´£¨ÒòΪ±ØÐ벻ͣÁ¬½Ó£¬»òÕß HTTP Á¬½ÓʼÖÕ´ò¿ª£©¡£Òò´Ë£¬¹¤³ÌʦÃÇÒ»Ö±ÔÚ˼¿¼£¬ÓÐûÓиüºÃµÄ·½·¨¡£WebSocket ¾ÍÊÇÕâÑù·¢Ã÷µÄ¡£

¶þ¡¢¼ò½é

WebSocket ЭÒéÔÚ2008Äêµ®Éú£¬2011Äê³ÉΪ¹ú¼Ê±ê×¼¡£ËùÓÐä¯ÀÀÆ÷¶¼ÒѾ­Ö§³ÖÁË¡£

ËüµÄ×î´óÌØµã¾ÍÊÇ£¬·þÎñÆ÷¿ÉÒÔÖ÷¶¯Ïò¿Í»§¶ËÍÆËÍÐÅÏ¢£¬¿Í»§¶ËÒ²¿ÉÒÔÖ÷¶¯Ïò·þÎñÆ÷·¢ËÍÐÅÏ¢£¬ÊÇÕæÕýµÄË«ÏòƽµÈ¶Ô»°£¬ÊôÓÚ·þÎñÆ÷ÍÆËͼ¼ÊõµÄÒ»ÖÖ¡£

ÆäËûÌØµã°üÀ¨£º

£¨1£©½¨Á¢ÔÚ TCP ЭÒéÖ®ÉÏ£¬·þÎñÆ÷¶ËµÄʵÏֱȽÏÈÝÒס£

£¨2£©Óë HTTP ЭÒéÓÐ×ÅÁ¼ºÃµÄ¼æÈÝÐÔ¡£Ä¬È϶˿ÚÒ²ÊÇ80ºÍ443£¬²¢ÇÒÎÕÊֽ׶βÉÓà HTTP ЭÒ飬Òò´ËÎÕÊÖʱ²»ÈÝÒׯÁ±Î£¬ÄÜͨ¹ý¸÷ÖÖ HTTP ´úÀí·þÎñÆ÷¡£

£¨3£©Êý¾Ý¸ñʽ±È½ÏÇáÁ¿£¬ÐÔÄÜ¿ªÏúС£¬Í¨ÐŸßЧ¡£

£¨4£©¿ÉÒÔ·¢ËÍÎı¾£¬Ò²¿ÉÒÔ·¢ËͶþ½øÖÆÊý¾Ý¡£

£¨5£©Ã»ÓÐͬԴÏÞÖÆ£¬¿Í»§¶Ë¿ÉÒÔÓëÈÎÒâ·þÎñÆ÷ͨÐÅ¡£

£¨6£©Ð­Òé±êʶ·ûÊÇws£¨Èç¹û¼ÓÃÜ£¬ÔòΪwss£©£¬·þÎñÆ÷ÍøÖ·¾ÍÊÇ URL¡£

ws://example.com:80/some/path

Èý¡¢¿Í»§¶ËµÄ¼òµ¥Ê¾Àý

WebSocket µÄÓ÷¨Ï൱¼òµ¥¡£

ÏÂÃæÊÇÒ»¸öÍøÒ³½Å±¾µÄÀý×Ó£¨µã»÷ÕâÀï¿´ÔËÐнá¹û£©£¬»ù±¾ÉÏÒ»ÑÛ¾ÍÄÜÃ÷°×¡£

var ws = new WebSocket("wss://echo.websocket.org");

ws.onopen = function(evt) {
console.log("Connection open ...");
ws.send("Hello WebSockets!");
};

ws.onmessage = function(evt) {
console.log( "Received Message: " + evt.data);
ws.close();
};

ws.onclose = function(evt) {
console.log("Connection closed.");
};

ËÄ¡¢¿Í»§¶ËµÄ API

WebSocket ¿Í»§¶ËµÄ API ÈçÏ¡£

4.1 WebSocket ¹¹Ô캯Êý

WebSocket ¶ÔÏó×÷Ϊһ¸ö¹¹Ô캯Êý£¬ÓÃÓÚн¨ WebSocket ʵÀý¡£

var ws = new WebSocket('ws://localhost:8080');

Ö´ÐÐÉÏÃæÓï¾äÖ®ºó£¬¿Í»§¶Ë¾Í»áÓë·þÎñÆ÷½øÐÐÁ¬½Ó¡£

ʵÀý¶ÔÏóµÄËùÓÐÊôÐԺͷ½·¨Çåµ¥£¬²Î¼ûÕâÀï¡£

4.2 webSocket.readyState

readyStateÊôÐÔ·µ»ØÊµÀý¶ÔÏóµÄµ±Ç°×´Ì¬£¬¹²ÓÐËÄÖÖ¡£

CONNECTING£ºÖµÎª0£¬±íʾÕýÔÚÁ¬½Ó¡£

OPEN£ºÖµÎª1£¬±íʾÁ¬½Ó³É¹¦£¬¿ÉÒÔͨÐÅÁË¡£

CLOSING£ºÖµÎª2£¬±íʾÁ¬½ÓÕýÔڹرա£

CLOSED£ºÖµÎª3£¬±íʾÁ¬½ÓÒѾ­¹Ø±Õ£¬»òÕß´ò¿ªÁ¬½Óʧ°Ü¡£

ÏÂÃæÊÇÒ»¸öʾÀý¡£

switch (ws.readyState) {
case WebSocket.CONNECTING:
// do something
break;
case WebSocket.OPEN:
// do something
break;
case WebSocket.CLOSING:
// do something
break;
case WebSocket.CLOSED:
// do something
break;
default:
// this never happens
break;
}

4.3 webSocket.onopen

ʵÀý¶ÔÏóµÄonopenÊôÐÔ£¬ÓÃÓÚÖ¸¶¨Á¬½Ó³É¹¦ºóµÄ»Øµ÷º¯Êý¡£

ws.onopen = function () {
ws.send('Hello Server!');
}

Èç¹ûÒªÖ¸¶¨¶à¸ö»Øµ÷º¯Êý£¬¿ÉÒÔʹÓÃaddEventListener·½·¨¡£

ws.addEventListener('open', function (event) {
ws.send('Hello Server!');
});

4.4 webSocket.onclose

ʵÀý¶ÔÏóµÄoncloseÊôÐÔ£¬ÓÃÓÚÖ¸¶¨Á¬½Ó¹Ø±ÕºóµÄ»Øµ÷º¯Êý¡£

ws.onclose = function(event) {
var code = event.code;
var reason = event.reason;
var wasClean = event.wasClean;
// handle close event
};

ws.addEventListener("close", function(event) {
var code = event.code;
var reason = event.reason;
var wasClean = event.wasClean;
// handle close event
});

4.5 webSocket.onmessage

ʵÀý¶ÔÏóµÄonmessageÊôÐÔ£¬ÓÃÓÚÖ¸¶¨ÊÕµ½·þÎñÆ÷Êý¾ÝºóµÄ»Øµ÷º¯Êý¡£


ws.onmessage = function(event) {
var data = event.data;
// ´¦ÀíÊý¾Ý
};

ws.addEventListener("message", function(event) {
var data = event.data;
// ´¦ÀíÊý¾Ý
});

×¢Ò⣬·þÎñÆ÷Êý¾Ý¿ÉÄÜÊÇÎı¾£¬Ò²¿ÉÄÜÊǶþ½øÖÆÊý¾Ý£¨blob¶ÔÏó»òArraybuffer¶ÔÏ󣩡£

ws.onmessage = function(event){
if(typeof event.data === String) {
console.log("Received data string");
}

if(event.data instanceof ArrayBuffer){
var buffer = event.data;
console.log("Received arraybuffer");
}
}

³ýÁ˶¯Ì¬ÅжÏÊÕµ½µÄÊý¾ÝÀàÐÍ£¬Ò²¿ÉÒÔʹÓÃbinaryTypeÊôÐÔ£¬ÏÔʽָ¶¨ÊÕµ½µÄ¶þ½øÖÆÊý¾ÝÀàÐÍ¡£

// ÊÕµ½µÄÊÇ blob Êý¾Ý
ws.binaryType = "blob";
ws.onmessage = function(e) {
console.log(e.data.size);
};

// ÊÕµ½µÄÊÇ ArrayBuffer Êý¾Ý
ws.binaryType = "arraybuffer";
ws.onmessage = function(e) {
console.log(e.data.byteLength);
};

4.6 webSocket.send()

ʵÀý¶ÔÏóµÄsend()·½·¨ÓÃÓÚÏò·þÎñÆ÷·¢ËÍÊý¾Ý¡£

·¢ËÍÎı¾µÄÀý×Ó¡£

ws.send('your message');

·¢ËÍ Blob ¶ÔÏóµÄÀý×Ó¡£

var file = document
.querySelector('input[type="file"]')
.files[0];
ws.send(file);

·¢ËÍ ArrayBuffer ¶ÔÏóµÄÀý×Ó¡£

// Sending canvas ImageData as ArrayBuffer
var img = canvas_context.getImageData(0, 0, 400, 320);
var binary = new Uint8Array(img.data.length);
for (var i = 0; i < img.data.length; i++) {
binary[i] = img.data[i];
}
ws.send(binary.buffer);

4.7 webSocket.bufferedAmount

ʵÀý¶ÔÏóµÄbufferedAmountÊôÐÔ£¬±íʾ»¹ÓжàÉÙ×ֽڵĶþ½øÖÆÊý¾ÝûÓз¢ËͳöÈ¥¡£Ëü¿ÉÒÔÓÃÀ´ÅжϷ¢ËÍÊÇ·ñ½áÊø¡£

var data = new ArrayBuffer(10000000);
socket.send(data);

if (socket.bufferedAmount === 0) {
// ·¢ËÍÍê±Ï
} else {
// ·¢ËÍ»¹Ã»½áÊø
}

4.8 webSocket.onerror

ʵÀý¶ÔÏóµÄonerrorÊôÐÔ£¬ÓÃÓÚÖ¸¶¨±¨´íʱµÄ»Øµ÷º¯Êý¡£

socket.onerror = function(event) {
// handle error event
};

socket.addEventListener("error", function(event) {
// handle error event
});

Îå¡¢·þÎñ¶ËµÄʵÏÖ

WebSocket ·þÎñÆ÷µÄʵÏÖ£¬¿ÉÒԲ鿴ά»ù°Ù¿ÆµÄÁÐ±í¡£

³£ÓÃµÄ Node ʵÏÖÓÐÒÔÏÂÈýÖÖ¡£

¦ÌWebSockets

Socket.IO

WebSocket-Node

¾ßÌåµÄÓ÷¨Çë²é¿´ËüÃǵÄÎĵµ£¬ÕâÀï²»Ïêϸ½éÉÜÁË¡£

Áù¡¢WebSocketd

ÏÂÃæ£¬ÎÒÒªÍÆ¼öÒ»¿î·Ç³£ÌرðµÄ WebSocket ·þÎñÆ÷£ºWebsocketd¡£

ËüµÄ×î´óÌØµã£¬¾ÍÊǺǫ́½Å±¾²»ÏÞÓïÑÔ£¬±ê×¼ÊäÈ루stdin£©¾ÍÊÇ WebSocket µÄÊäÈ룬±ê×¼Êä³ö£¨stdout£©¾ÍÊÇ WebSocket µÄÊä³ö¡£

¾ÙÀýÀ´Ëµ£¬ÏÂÃæÊÇÒ»¸ö Bash ½Å±¾counter.sh¡£

#!/bin/bash

echo 1
sleep 1

echo 2
sleep 1

echo 3

ÃüÁîÐÐÏÂÔËÐÐÕâ¸ö½Å±¾£¬»áÊä³ö1¡¢2¡¢3£¬Ã¿¸öÖµÖ®¼ä¼ä¸ô1Ãë¡£

$ bash ./counter.sh
1
2
3

ÏÖÔÚ£¬Æô¶¯websocketd£¬Ö¸¶¨Õâ¸ö½Å±¾×÷Ϊ·þÎñ¡£

$ websocketd --port=8080 bash ./counter.sh

ÉÏÃæµÄÃüÁî»áÆô¶¯Ò»¸ö WebSocket ·þÎñÆ÷£¬¶Ë¿ÚÊÇ8080¡£Ã¿µ±¿Í»§¶ËÁ¬½ÓÕâ¸ö·þÎñÆ÷£¬¾Í»áÖ´ÐÐcounter.sh½Å±¾£¬²¢½«ËüµÄÊä³öÍÆË͸ø¿Í»§¶Ë¡£


var ws = new WebSocket('ws://localhost:8080/');

ws.onmessage = function(event) {
console.log(event.data);
};

ÉÏÃæÊǿͻ§¶ËµÄ JavaScript ´úÂ룬ÔËÐÐÖ®ºó»áÔÚ¿ØÖÆÌ¨ÒÀ´ÎÊä³ö1¡¢2¡¢3¡£

ÓÐÁËËü£¬¾Í¿ÉÒԺܷ½±ãµØ½«ÃüÁîÐеÄÊä³ö£¬·¢¸øä¯ÀÀÆ÷¡£

$ websocketd --port=8080 ls

ÉÏÃæµÄÃüÁî»áÖ´ÐÐlsÃüÁ´Ó¶ø½«µ±Ç°Ä¿Â¼µÄÄÚÈÝ£¬·¢¸øä¯ÀÀÆ÷¡£Ê¹ÓÃÕâÖÖ·½Ê½ÊµÊ±¼à¿Ø·þÎñÆ÷£¬¼òÖ±ÊÇÇá¶øÒ×¾Ù£¨´úÂ룩¡£

¸ü¶àµÄÓ÷¨¿ÉÒԲο¼¹Ù·½Ê¾Àý¡£

Bash ½Å±¾¶ÁÈ¡¿Í»§¶ËÊäÈëµÄÀý×Ó

ÎåÐдúÂëʵÏÖÒ»¸ö×î¼òµ¥µÄÁÄÌì·þÎñÆ÷

websocketd µÄʵÖÊ£¬¾ÍÊÇÃüÁîÐÐµÄ WebSocket ´úÀí¡£Ö»ÒªÃüÁîÐпÉÒÔÖ´ÐеijÌÐò£¬¶¼¿ÉÒÔͨ¹ýËüÓëä¯ÀÀÆ÷½øÐÐ WebSocket ͨÐÅ¡£ÏÂÃæÊÇÒ»¸ö Node ʵÏֵĻØÉù·þÎñgreeter.js¡£

process.stdin.setEncoding('utf8');

process.stdin.on('readable', function() {
var chunk = process.stdin.read();
if (chunk !== null) {
process.stdout.write('data: ' + chunk);
}
});

Æô¶¯Õâ¸ö½Å±¾µÄÃüÁîÈçÏ¡£

$ websocketd --port=8080 node ./greeter.js

¹Ù·½²Ö¿â»¹ÓÐÆäËû¸÷ÖÖÓïÑÔµÄÀý×Ó¡£

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

Éî¶È½âÎö£ºÇåÀíÀôúÂë
ÈçºÎ±àд³öÓµ±§±ä»¯µÄ´úÂë
ÖØ¹¹-ʹ´úÂë¸ü¼ò½àÓÅÃÀ
ÍŶÓÏîÄ¿¿ª·¢"±àÂë¹æ·¶"ϵÁÐÎÄÕÂ
Ïà¹ØÎĵµ

ÖØ¹¹-¸ÄÉÆ¼ÈÓдúÂëµÄÉè¼Æ
Èí¼þÖØ¹¹v2
´úÂëÕû½àÖ®µÀ
¸ßÖÊÁ¿±à³Ì¹æ·¶
Ïà¹Ø¿Î³Ì

»ùÓÚHTML5¿Í»§¶Ë¡¢Web¶ËµÄÓ¦Óÿª·¢
HTML 5+CSS ¿ª·¢
ǶÈëʽC¸ßÖÊÁ¿±à³Ì
C++¸ß¼¶±à³Ì