±à¼ÍƼö: |
±¾ÎÄÀ´×ÔÓÚÈîÒ»·å,±¾ÎÄÖ÷ÒªÓÃ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()·½·¨ÓÃÓÚÏò·þÎñÆ÷·¢ËÍÊý¾Ý¡£
·¢ËÍÎı¾µÄÀý×Ó¡£
·¢ËÍ 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
|
¹Ù·½²Ö¿â»¹ÓÐÆäËû¸÷ÖÖÓïÑÔµÄÀý×Ó¡£
|