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

1Ôª 10Ôª 50Ôª





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



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
ʹÓà Node.js ×÷ΪÍêÕûµÄÔÆ»·¾³¿ª·¢¶ÑÕ»
 
×÷ÕߣºNoah Gift, Jeremy Jones À´Ô´£ºIBM ·¢²¼ÓÚ 2015-03-13
  2340  次浏览      27
 

ʹÓÃͨ¹ý»Øµ÷µÄÒì²½ I/O ¿ª·¢²¢·¢Ä£ÐÍ£¬²¢¹¹½¨ÁÄÌì·þÎñÆ÷

±¾ÎÄ̽ÌÖ Node.js£¬ÕâÊÇÒ»¸öÓÃÓÚ UNIX? ÀàÆ½Ì¨ÉÏ V8 JavaScript? ÒýÇæµÄʼþÇý¶¯µÄ I/O ¿ò¼Ü£¬Éè¼ÆÕâÒ»¿ò¼ÜµÄÄ¿µÄÊÇΪÁ˱àд¿ÉÉìËõµÄÍøÂç³ÌÐò£¬Èç Web ·þÎñÆ÷¡£±¾ÎÄͨ¹ýÒ»¸öÍêÕûµÄÀý×Ó˵Ã÷ÈçºÎÔÚ Node.js Öй¹½¨ÁÄÌì·þÎñÆ÷£¬·ÖÎöÁËÕâ¸ö¿ò¼ÜÒÔ¼°Î§ÈÆËüµÄÉú̬ϵͳ£¨°üÀ¨ÔƼÆËã²úÆ·£©£¬²¢¶ÔÕâ¸ö¿ò¼Ü½øÐÐÁË×ܽᡣ

Ëæ×ż¼Êõ´´Ð±íÃæÉϼÌÐøÒÔÖ¸Êý¼¶ËÙ¶È·¢Õ¹£¬ÐÂ˼Ïë²ã³ö²»Çî¡£·þÎñÆ÷¶ËµÄ JavaScript ¾ÍÊÇÕâЩÐÂ˼ÏëÖ®Ò»¡£ Node.js ÊÇÒ»ÖÖʼþÇý¶¯µÄ I/O ¿ò¼Ü£¬ÓÃÓÚ UNIX ÀàÆ½Ì¨É쵀 V8 JavaScript ÒýÇæ£¬ÊʺÏÓÚ±àд¿ÉÉìËõµÄÍøÂç³ÌÐò£¬Èç Web ·þÎñÆ÷¡£ Node.js ÕýÊÇÕâÖÖÐÂ˼ÏëµÄʵÏÖ¡£

Node.js ²¢·ÇÓë JavaScript ¿¹ºâ£¬¶øÊÇʹÓÃËü×÷ΪÍêÕûµÄ¿ª·¢¶ÑÕ»£¬´Ó·þÎñÆ÷¶Ë´úÂëÒ»Ö±ÑÓÉìµ½ä¯ÀÀÆ÷¡£Node.js »¹³ä·ÖÀûÓÃÁËÁíÒ»ÖÖ ´´ÐÂ˼Ï룺ͨ¹ý»Øµ÷ÀûÓÃÒì²½ I/O µÄ²¢·¢ÐÔÄ£ÐÍ¡£

Node.js ÔÆ¼ÆËãÆ½Ì¨

ÔÚÔÆ¼ÆËã»·¾³ÖÐʹÓà Node.js ¿ò¼Üʱ£¬ÄÜÏÔʾ³öËüµÄÒ»¸ö¾Þ´óÓŵ㡣¶ÔÓÚÓ¦ÓóÌÐò¿ª·¢ÈËÔ±£¬ÕâÍùÍù¹é½áʹÓÃÆ½Ì¨¼´·þÎñ (PaaS) »ò»ù´¡¼Ü¹¹¼´·þÎñ (IaaS) Ä£ÐÍ¡£¶ÔÓÚ¿ª·¢ÈËÔ±¶øÑÔ£¬×î³éÏóºÍ¹«ÈÏ×î·½±ãµÄ·½·¨ÊÇʹÓà PaaS Ìṩ³ÌÐò¡£Í¼ 1 Ê®·Ö¼òµ¥µØËµÃ÷ÁË PaaS ºÍ IaaS Ä£Ð͵Ľṹ¡£

ͼ 1. PaaS Óë IaaS ½á¹¹

×î½ü£¬Ò»¸ö¼¤¶¯ÈËÐĵĿªÔ´ÏîÄ¿ Cloud Foundry ¹«²¼ÁË´úÂëÒÔ´´½¨Ò»¸öÄܹ»ÔËÐÐ Node.js µÄ˽ÓÐ PaaS¡£ ͬÑùµÄÖ÷»úÒýÇæÒ²¿ÉÓÃÔÚ¹«¹²ÔƺÍÉÌÒµÔÆÖУ¬¶øÇÒËüÃǽÓÊÜÈí¼þ²¹¶¡¡£

»ù´¡¼Ü¹¹¹ÜÀíÊÇÒ»´óÍ´µã£¬Èç¹ûÄܹ»½«ÕâÏ×÷Íâ°ü£¨ÓÀÔ¶£¡£©¸ø¹æÄ£¾­ÓªµÄÌṩÉÌ£¬ÇÒÎÞÂÛÊÇÔ´´úÂ룬»¹ÊÇÎïÀíÓ²¼þ×ÊÔ´£¬¶ÔÓÚ¿ª·¢ÈËԱȷʵÊÇÒ»¸ö¼¤¶¯ÈËÐĵÄʱ¿Ì¡£

ʹÓà Node.js shell

ÔÚÎÒÃÇ×ÅÊÖ±àдһ¸öÍêÕûµÄ Node.js Àý×Ó֮ǰ£¬ÈÃÎÒÃÇÏÈ¿ªÊ¼½éÉÜÈçºÎʹÓý»»¥Ê½ shell¡£Èç¹ûÉÐδ°²×° Node.js£¬Äú¿ÉÒԲο¼×ÊÔ´²¿·Ö£¬È»ºó°´ÕÕ˵Ã÷°²×°Ëü£¬»òÕßʹÓÃÔÚÏߵĽ»»¥Ê½ Node.js Õ¾µãÖ®Ò»£¬ËüÔÊÐíÄúÖ±½ÓÔÚä¯ÀÀÆ÷ÖÐÊäÈë´úÂë¡£

ÒªÔÚ Node.js ÖÐÒÔ½»»¥·½Ê½±àд JavaScript º¯Êý£¬ÔÚÃüÁîÐÐÌáʾÖÐÊäÈënode£¬ÈçÏÂËùʾ£º

lion% node
> var foo = {bar: 'baz'};
> console.log(foo);
{ bar: 'baz' }
>

ÔÚÕâ¸öÀý×ÓÖУ¬´´½¨Á˶ÔÏófoo£¬È»ºóµ÷ÓÃconsole.log ½«ËüÊä³öµ½¿ØÖÆÌ¨¡£ ÕâÊ®·ÖÓÐЧ¶øÇÒÓÐȤ£¬²»¹ýµ±ÄúʹÓà tab Íê³É¹¦ÄÜÀ´Ì½ÌÖ foo ʱ£¬ÈçÏÂÃæµÄÀý×ÓËùʾ£¬ÕæÕýµÄÀÖȤ²Å¸Õ¸Õ¿ªÊ¼¡£ Èç¹ûÊäÈë foo.bar.£¬È»ºó°´Ï tab ¼ü£¬Äú½«¿´µ½¶ÔÏóÉϵĿÉÓ÷½·¨¡£

> foo.bar.
[...output suppressed for space...]
foo.bar.toUpperCase foo.bar.trim
foo.bar.trimLeft foo.bar.trimRight

ÊÔÓà toUpperCase ·½·¨ËƺõºÜÓÐȤ£¬ÏÂÃæÏÔʾÁËËüµÄÓ÷¨£º

> foo.bar.toUpperCase();
'BAZ'

Äú¿ÉÒÔ¿´µ½£¬¸Ã·½·¨½«×Ö·û´®×ª»»Îª´óд×Öĸ¡£ÕâÀཻ»¥Ê½¿ª·¢·Ç³£ÊʺÏÓÚʹÓÃÏñ Node.js ÕâÑùµÄʼþÇý¶¯ÐÍ¿ò¼Ü½øÐпª·¢¡£

ÔÚÍê³É¼òµ¥½éÉÜÖ®ºó£¬ÎÒÃÇ¿ªÊ¼ÕæÕýµØ¹¹½¨Ò»Ð©¶«Î÷¡£

Óà Node.js ¹¹½¨ÁÄÌì·þÎñÆ÷

Node.js Èñàд»ùÓÚʼþµÄÍøÂç·þÎñÆ÷±äµÃÊ®·Ö¼òµ¥¡£ÀýÈ磬ÈÃÎÒÃÇ´´½¨Ò»Ð©ÁÄÌì·þÎñÆ÷¡£ µÚÒ»¸ö·þÎñÆ÷Ê®·Ö¼òµ¥£¬¼¸ºõûÓÐʲô¹¦ÄÜ£¬Ò²Ã»ÓÐÈκÎÒì³£´¦Àí¡£

Ò»¸öÁÄÌì·þÎñÆ÷ÔÊÐí¶à¸ö¿Í»§¶ËÁ¬½Óµ½Ëü¡£Ã¿¸ö¿Í»§¶Ë¶¼¿ÉÒÔ±àдÏûÏ¢£¬È»ºó¹ã²¥¸øËùÓÐÆäËûÓû§¡£ÏÂÃæ¸ø³öÁË×î¼òµ¥µÄÁÄÌì·þÎñÆ÷µÄ´úÂë¡£

net = require('net');

var sockets = [];

var s = net.Server(function(socket) {

    sockets.push(socket);

    socket.on('data', function(d) {

        for (var i=0; i < sockets.length; i++ ) {
            sockets[i].write(d);
        }
    });
});

s.listen(8001);

ÔÚ²»µ½ 20 ÐдúÂëÖУ¨Êµ¼ÊÉÏ£¬ÕæÕýʵÏÖ¹¦ÄܵĴúÂëÖ»ÓÐ 8 ÐУ©£¬ÄúÒѾ­¹¹½¨ÁËÒ»¸öÄܹ»Ê¹ÓõÄÁÄÌì·þÎñÆ÷¡£ ÏÂÃæÊÇÕâ¸ö¼òµ¥³ÌÐòµÄÁ÷³Ì£º

1.µ±Ò»¸öÌ×½Ó×Ö½øÐÐÁ¬½Óʱ£¬½«¸ÃÌ×½Ó×Ö¶ÔÏ󸽼ӵ½Ò»¸öÊý×é¡£

2.µ±¿Í»§¶ËдÈëËüÃǵÄÁ¬½Óʱ£¬½«¸ÃÊý¾Ýдµ½ËùÓеÄÌ×½Ó×Ö¡£

ÏÖÔÚ£¬ÈÃÎÒÃǼì²éËùÓдúÂ룬²¢½âÊÍÕâ¸öÀý×ÓÈçºÎʵÏÖÁÄÌì·þÎñÆ÷Ô¤¶¨¹¦ÄÜ¡£µÚÒ»ÐÐÔÊÐí·ÃÎÊ net Ä£¿éµÄÄÚÈÝ£º

net = require('net');

ÈÃÎÒÃÇʹÓÃÕâ¸öÄ£¿éÖÐµÄ Server¡£

Äú½«ÐèÒªÒ»¸öλÖÃÀ´±£´æËùÓпͻ§¶ËÁ¬½Ó£¬ÒÔ±ãÔÚдÈëÊý¾Ýʱ¿ÉÒÔдµ½ËüÃÇÖÐÈ¥¡£ ÏÂÃæÊÇÓÃÓÚ±£´æËùÓпͻ§¶ËÌ×½Ó×ÖÁ¬½ÓµÄ±äÁ¿£º

var sockets = [];

ÏÂÒ»ÐпªÊ¼Ò»¸ö´úÂë¿é£¬¹æ¶¨µ±Ã¿¸ö¿Í»§¶ËÁ¬½ÓʱҪ×öµÄÊÂÇé¡£

var s = net.Server(function(socket) {

´«µÝµ½ Server ÖеÄΩһ²ÎÊýÊǽ«Õë¶Ôÿ¸ö¿Í»§¶ËÁ¬½Ó½øÐе÷ÓõÄÒ»¸öº¯Êý¡£ ÔÚÕâ¸öº¯ÊýÖУ¬½«¿Í»§¶ËÁ¬½ÓÌí¼Óµ½ËùÓпͻ§¶ËÁ¬½ÓµÄÁбíÖУº

sockets.push(socket);

ÏÂÒ»²¿·Ö´úÂ뽨Á¢ÁËÒ»¸öʼþ´¦ÀíÆ÷£¬¹æ¶¨Á˵±Ò»¸ö¿Í»§¶Ë·¢ËÍÊý¾ÝʱҪ×öµÄÊÂÇ飺

socket.on('data', function(d) {

    for (var i=0; i < sockets.length; i++ ) {
        sockets[i].write(d);
    }
});

socket.on() ·½·¨µ÷ÓÃΪ½Úµã×¢²áÒ»¸öʼþ´¦ÀíÆ÷£¬ÒԱ㵱ijЩʼþ·¢ÉúʱËüÖªµÀÈçºÎ´¦Àí¡£ µ±½ÓÊÕµ½À´×Ô¿Í»§¶ËµÄÊý¾Ýʱ£¬Node.js »áµ÷ÓÃÕâ¸öÌØÊâµÄʼþ´¦ÀíÆ÷¡£ÆäËûµÄʼþ´¦ÀíÆ÷°üÀ¨ connect¡¢end¡¢timeout¡¢drain¡¢error ºÍ close¡£socket.on() ·½·¨µ÷ÓõĽṹÀàËÆÓÚÇ°ÃæÌá¹ýµÄ Server() µ÷ÓᣠÄú´«ÈëÒ»¸öº¯Êý¸øÕâÁ½Õߣ¬µ±ÓÐÊ·¢Éúʱµ÷Óô˺¯Êý¡£ÕâÖֻص÷·½·¨ÔÚÒì²½Íø

Âç¿ò¼ÜÖкܳ£¼û¡£ ÕâÊǵ±¿ªÊ¼Ê¹ÓÃÏñ Node.js ÕâÑùµÄÒì²½¿ò¼Üʱ£¬ÓµÓйý³Ì±à³Ì¾­ÑéµÄÈË»áÓöµ½µÄÖ÷ÒªÎÊÌâ¡£

ÔÚÕâÖÖÇé¿öÏ£¬µ±ÈÎÒâ¿Í»§¶Ë·¢ËÍÊý¾Ý¸ø·þÎñÆ÷ʱ£¬¾Í»áµ÷ÓÃÕâ¸öÄäÃûº¯Êý²¢½«Êý¾Ý´«È뺯ÊýÖС£Ëü»ùÓÚÄúÒѾ­»ýÀÛµÄÌ×½Ó×Ö¶ÔÏóÁÐ±í½øÐеü´ú£¬ ²¢¸øËüÃÇÈ«²¿·¢ËÍÏàͬµÄÊý¾Ý¡£Ã¿¸ö¿Í»§¶ËÁ¬½Ó¶¼½«½ÓÊÕµ½ÕâЩÊý¾Ý¡£

Õâ¸öÁÄÌì·þÎñÆ÷Ê®·Ö¼òµ¥£¬ËüȱÉÙһЩ·Ç³£»ù´¡µÄ¹¦ÄÜ£¬±ÈÈçʶ±ðÊÇË­·¢ËÍÄÄÌõÏûÏ¢£¬»òÕß´¦Àíij¸ö¿Í»§¶Ë¶Ï¿ªµÄÇé¿ö¡£ £¨Èç¹ûÒ»¸ö¿Í»§¶Ë´ÓÕą̂ÁÄÌì·þÎñÆ÷¶Ï¿ª£¬ÈκÎÈË·¢ËÍÏûÏ¢£¬·þÎñÆ÷¶¼»á±ÀÀ£¡££©

ÏÂÃæµÄÔ´´úÂ루ÔÚÏÂÔØÊ¾ÀýÎļþÖнÐ×ö chat2.js £©ÊÇÒ»¸ö¾­¹ý¸Ä½øµÄÌ×½Ó×Ö·þÎñÆ÷£¬Æä¹¦ÄÜÓÐËùÔöÇ¿£¬Äܹ»´¦Àí¡°Ôã¸âµÄÇé¿ö¡±£¨±ÈÈç¿Í»§¶Ë¶Ï¿ª£©¡£

net = require('net');

var sockets = [];
var name_map = new Array();
var chuck_quotes = [
    "There used to be a street named after Chuck Norris, but it was changed because 
     nobody crosses Chuck Norris and lives.",
    "Chuck Norris died 20 years ago, Death just hasn't built up the courage to tell 
     him yet.",
    "Chuck Norris has already been to Mars; that's why there are no signs of life.",
    "Some magicians can walk on water, Chuck Norris can swim through land.",
    "Chuck Norris and Superman once fought each other on a bet. The loser had to start 
     wearing his underwear on the outside of his pants."
]

function get_username(socket) {
    var name = socket.remoteAddress;
    for (var k in name_map) {
        if (name_map[k] == socket) {
            name = k;
        }
    }
    return name;
}

function delete_user(socket) {
    var old_name = get_username(socket);
    if (old_name != null) {
        delete(name_map[old_name]);
    }
}

function send_to_all(message, from_socket, ignore_header) {
    username = get_username(from_socket);
    for (var i=0; i < sockets.length; i++ ) {
        if (from_socket != sockets[i]) {
            if (ignore_header) {
                send_to_socket(sockets[i], message);
            }
            else {
                send_to_socket(sockets[i], username + ': ' + message);
            }
        }
    }
}

function send_to_socket(socket, message) {
    socket.write(message + '\n');
}

function execute_command(socket, command, args) {
    if (command == 'identify') {
        delete_user(socket);
        name = args.split(' ', 1)[0];
        name_map[name] = socket;
    }
    if (command == 'me') {
        name = get_username(socket);
        send_to_all('**' + name + '** ' + args, socket, true);
    }
    if (command == 'chuck') {
        var i = Math.floor(Math.random() * chuck_quotes.length);
        send_to_all(chuck_quotes[i], socket, true);
    }
    if (command == 'who') {
        send_to_socket(socket, 'Identified users:');
        for (var name in name_map) {
            send_to_socket(socket, '- ' + name);
        }
    }
}

function send_private_message(socket, recipient_name, message) {
    to_socket = name_map[recipient_name];
    if (! to_socket) {
        send_to_socket(socket, recipient_name + ' is not a valid user');
        return;
    }
    send_to_socket(to_socket, '[ DM ' + get_username(socket) + ' ]: ' + message);
}

var s = net.Server(function(socket) {
    sockets.push(socket);
    socket.on('data', function(d) {
        data = d.toString('utf8').trim();
        // check if it is a command
        var cmd_re = /^\/([a-z]+)[ ]*(.*)/g;
        var dm_re = /^@([a-z]+)[ ]+(.*)/g;
        cmd_match = cmd_re.exec(data)
        dm_match = dm_re.exec(data)
        if (cmd_match) {
            var command = cmd_match[1];
            var args = cmd_match[2];
            execute_command(socket, command, args);
        }
        // check if it is a direct message
        else if (dm_match) {
            var recipient = dm_match[1];
            var message = dm_match[2];
            send_private_message(socket, recipient, message);
        }
        // if none of the above, send to all
        else {
            send_to_all(data, socket);
        };

    });
    socket.on('close', function() {
        sockets.splice(sockets.indexOf(socket), 1);
        delete_user(socket);
    });
});
s.listen(8001);

ÉÔ΢¸ß¼¶Ò»µãµÄÖ÷Ì⣺ÁÄÌì·þÎñÆ÷µÄ¸ºÔØÆ½ºâ

ͨ³££¬¸ºÔذ´±ÈÀýÔö³¤Ò²ÊDz¿Êðµ½ÔÆ»·¾³µÄÀíÓÉÖ®Ò»¡£ÕâÖÖ²¿ÊðÐèҪʵÏÖһЩ¸ºÔØÆ½ºâ»úÖÆ¡£

´ó¶àÊýÇáÁ¿¼¶ Web ·þÎñÆ÷£¬±ÈÈç nginx ºÍ lighttpd£¬¶¼Äܹ»Õë¶Ô¶ą̀ HTTP ·þÎñÆ÷½øÐиºÔØÆ½ºâ£¬µ«Èç¹ûÄúÏëÒªÔÚ·Ç HTTP ·þÎñÆ÷Ö®¼äʵÏÖÆ½ºâ£¬nginx ¿ÉÄÜÎÞ·¨Âú×ãÒªÇó¡£¶øÇÒ¾¡¹Ü´æÔÚͨÓÃµÄ TCP ¸ºÔØÆ½ºâÆ÷£¬Äú¿ÉÄܲ»»áϲ»¶ËüÃÇʹÓõĸºÔØÆ½ºâËã·¨¡£»òÕßËüÃÇûÓÐÌṩÄúÏëҪʹÓõÄһЩ¹¦ÄÜ¡£»òÕߣ¬ÄúÖ»ÊÇÏëÏíÊܹ¹Ôì×Ô¼ºµÄ¸ºÔØÆ½ºâÆ÷µÄÀÖȤ¡£

ÏÂÃæÊÇ×î¼òµ¥µÄ¸ºÔØÆ½ºâÆ÷¡£ËüûÓÐʵÏÖÈκιÊÕϻָ´£¬Ï£ÍûËùÓеÄÄ¿µÄµØ¶¼ÊÇ¿ÉÓõ쬶øÇÒûÓнøÐÐÈκδíÎó´¦Àí¡£ËüÊ®·Ö¼òÔ¼¡£ »ù±¾µÄÀíÄîÊÇ£¬Ëü½ÓÊÕÒ»¸öÀ´×Ô¿Í»§¶ËµÄÌ×½Ó×ÖÁ¬½Ó£¬Ëæ»úÌôѡһ¸öÄ¿±ê·þÎñÆ÷½øÐÐÁ¬½Ó£¬È»ºó½«À´×Ô¿Í»§¶ËµÄËùÓÐÊý¾Ýת·¢¸ø¸Ã·þÎñÆ÷£¬²¢½«À´×Ը÷þÎñÆ÷µÄËùÓÐÊý¾Ý¶¼·¢»Øµ½¿Í»§¶Ë¡£

net = require('net');

var destinations = [
    ['localhost', 8001],
    ['localhost', 8002],
    ['localhost', 8003],
]

var s = net.Server(function(client_socket) {
    var i = Math.floor(Math.random() * destinations.length);
    console.log("connecting to " + destinations[i].toString() + "\n");
    var dest_socket = net.Socket();
    dest_socket.connect(destinations[i][1], destinations[i][0]);

    dest_socket.on('data', function(d) {
        client_socket.write(d);
    });
    client_socket.on('data', function(d) {
        dest_socket.write(d);
    });
});
s.listen(9001);

destinations µÄ¶¨ÒåÊÇÎÒÃÇÒª½øÐÐÆ½ºâµÄºó¶Ë·þÎñÆ÷µÄÅäÖᣠÕâÊÇÒ»¸ö¼òµ¥µÄ¶àάÊý×飬Ö÷»úÃûÊǵÚÒ»¸öÔªËØ£¬¶Ë¿ÚºÅÊǵڶþ¸öÔªËØ¡£
Server() µÄ¶¨ÒåÀàËÆÓÚÁÄÌì·þÎñÆ÷µÄÀý×Ó¡£Äú´´½¨Ò»¸öÌ×½Ó×Ö·þÎñÆ÷£¬²¢ÈÃËü¼àÌýÒ»¸ö¶Ë¿Ú¡£Õâ´ÎËü½«¼àÌý 9001 ¶Ë¿Ú¡£

Õë¶Ô Server() ¶¨ÒåµÄ»Øµ÷Ê×ÏÈËæ»úÑ¡ÔñÒ»¸öÒªÁ¬½Óµ½µÄÄ¿µÄµØ£º

var i = Math.floor(Math.random() * destinations.length);

Äú¿ÉÄÜÒѾ­Ê¹ÓùýÂÖѯËã·¨»òʹÓá°×îÉÙÁ¬½ÓÊý¡±Ëã·¨Íê³ÉһЩ¶îÍâµÄ¹¤×÷È»ºóÀëÈ¥£¬µ«ÎÒÃÇÏ뾡¿ÉÄܵر£³Ö¼òµ¥¡£

Õâ¸öÀý×ÓÖÐÓÐÁ½¸öÖ¸¶¨µÄÌ×½Ó×Ö¶ÔÏó£º client_socket ºÍ dest_socket¡£

client_socket ÊǸºÔØÆ½ºâÆ÷Óë¿Í»§¶ËÖ®¼äµÄÁ¬½Ó¡£

dest_socket ÊǸºÔØÆ½ºâÆ÷Ó뱻ƽºâ·þÎñÆ÷Ö®¼äµÄÁ¬½Ó¡£

ÕâÁ½¸öÌ×½Ó×Ö·Ö±ð´¦ÀíÒ»¸öʼþ£º½ÓÊÕµ½µÄÊý¾Ý¡£µ±ËüÃÇÆäÖÐÒ»¸öÊÕµ½Êý¾Ýʱ£¬¾Í»á½«Êý¾Ýдµ½ÁíÒ»¸öÌ×½Ó×Ö¡£

ÈÃÎÒÃÇÍêÕûµØÁ˽⵱һ¸ö¿Í»§¶Ëͨ¹ý¸ºÔØÆ½ºâÆ÷Á¬½Óµ½Í¨ÓÃÍøÂç·þÎñÆ÷ÉÏ£¬·¢ËÍÊý¾Ý£¬È»ºó½ÓÊÕÊý¾Ýʱ·¢ÉúµÄÊÂÇé¡£

µ±Ò»¸ö¿Í»§µÄÁ¬½Óµ½¸ºÔØÆ½ºâÆ÷ʱ£¬Node.js ÔÚ¿Í»§¶ËÓë×Ô¼º±¾ÉíÖ®¼ä´´½¨Ò»¸öÌ×½Ó×Ö£¬ÎÒÃdzÆÖ®Îª client_socket¡£

µ±Á¬½Ó½¨Á¢Ö®ºó£¬¸ºÔØÆ½ºâÆ÷Ìôѡһ¸öÄ¿µÄµØ²¢´´½¨Ò»¸öÖ¸Ïò¸ÃÄ¿µÄµØµÄÌ×½Ó×ÖÁ¬½Ó£¬ÎÒÃdzÆÖ®Îª dest_socket¡£

µ±¿Í»§¶Ë·¢ËÍÊý¾Ýʱ£¬¸ºÔØÆ½ºâÆ÷½«ÏàͬµÄÊý¾ÝÍÆË͵½Ä¿µÄµØ·þÎñÆ÷¡£

µ±Ä¿µÄµØ·þÎñÆ÷×ö³öÏìÓ¦²¢½«Ò»Ð©Êý¾Ýдµ½ dest_socket ʱ£¬¸ºÔØÆ½ºâÆ÷ͨ¹ý client_socket ½«ÕâЩÊý¾ÝÍÆËͻؿͻ§¶Ë¡£

¿ÉÒÔ¶ÔÕâ¸ö¸ºÔØÆ½ºâÆ÷½øÐÐһЩ¸Ä½ø£¬°üÀ¨´íÎó´¦Àí£¬ÔÚͬһ¸ö½ø³ÌÖÐǶÈëÁíÒ»¸ö½ø³ÌÒÔ¶¯Ì¬Ôö¼ÓºÍÒÆ³ýÄ¿µÄµØ£¬Ôö¼Ó²»Í¬µÄƽºâËã·¨£¬ÒÔ¼°Ôö¼ÓһЩÈÝ´í´¦Àí¡£

³¬Ô½Ô­Éú½â¾ö·½°¸£ºExpress Web ¿ò¼Ü

Node.js Å䱸ÓÐ HTTP ·þÎñÆ÷¹¦ÄÜ£¬µ«½ÏΪµÍ¼¶¡£Èç¹ûÒªÔÚ Node.js Öй¹½¨Ò»¸ö Web Ó¦ÓóÌÐò£¬Äú¿ÉÄܻῼÂÇ Express¡ª¡ªÒ»¸öΪ Node.js ´òÔìµÄ Web Ó¦ÓóÌÐò¿ª·¢¿ò¼Ü¡£ËüÃÖ²¹ÁË Node.js µÄһЩ²»×ã¡£

ÔÚÏÂÒ»¸öÀý×ÓÖУ¬ÈÃÎÒÃÇÖØµã¹Ø×¢Ê¹Óà Express ʤ¹ý¼òµ¥µÄ Node.js µÄһЩÃ÷ÏÔÓÅÊÆ¡£ ÇëÇó·ÓɾÍÊÇÆäÖÐÖ®Ò»£¬»¹ÓÐÒ»¸öÊÇΪ HTTP "verb" ÀàÐÍ×¢²áÒ»¸öʼþ£¬±ÈÈç¡°get¡±»ò¡°post¡±¡£

ÏÂÃæ¸ø³öÁËÒ»¸öÊ®·Ö¼òµ¥µÄ Web Ó¦ÓóÌÐò£¬ËüÖ»ÊÇÑÝʾÁË Express µÄһЩ»ù±¾¹¦ÄÜ¡£

var app = require('express').createServer();

app.get('/', function(req, res){
  res.send('This is the root.');
});

app.get('/root/:id', function(req, res){
  res.send('You sent ' + req.params.id + ' as an id');
});

app.listen(7000);

ÕâÁ½ÐÐÒÔ app.get() ¿ªÊ¼µÄ´úÂëÊÇʼþ´¦ÀíÆ÷£¬µ± GET ÇëÇó½øÈëʱ¾Í»á´¥·¢¡£ ÕâÁ½´Î·½·¨µ÷ÓõĵÚÒ»¸ö²ÎÊýÊÇÒ»¸öÕýÔò±í´ïʽ£¬ÓÃÓÚÖ¸¶¨Óû§¿ÉÄÜ´«ÈëµÄ URL¡£µÚ¶þ¸ö²ÎÊýÊÇÕæÕý´¦ÀíÇëÇóµÄÒ»¸öº¯Êý¡£

ÕýÔò±í´ïʽ²ÎÊýÊÇ·ÓÉ»úÖÆ¡£Èç¹ûÇëÇóÀàÐÍ£¨GET¡¢POSTµÈ£©Óë×ÊÔ´£¨/, /root/123£©Æ¥Å䣬¾Í»áµ÷Óô¦ÀíÆ÷º¯Êý¡£ÔÚµÚÒ»´Î app.get() µ÷ÓÃÖУ¬/ ±»¼òµ¥µØÖ¸¶¨Îª×ÊÔ´¡£¶øÔÚµÚ¶þ´Îµ÷ÓÃÖУ¬ÔÚÖ¸¶¨/root ʱºóÃæ»¹¼ÓÁËÒ»¸ö ID¡£Ó³Éä regex µÄ URL ÖÐ×ÊÔ´Ç°ÃæµÄðºÅ(:) ×Ö·û±íÃ÷£¬Õⲿ·ÖÉÔºó¿É×÷Ϊһ¸ö²ÎÊýʹÓá£

µ±ÇëÇóÀàÐÍÓëÕý¹æ±í´ïʽƥÅäʱ£¬¾Í»áµ÷Óô¦ÀíÆ÷º¯Êý¡£ ´Ëº¯Êý´øÓÐÁ½¸ö²ÎÊý£¬Ò»¸öÇëÇó£¨req£© ºÍÒ»¸öÏìÓ¦£¨res£©¡£ Ç°ÃæÌáµ½µÄ²ÎÊý±»¸½¼Ó¸øÇëÇó¶ÔÏó¡£¶ø Web ·þÎñÆ÷´«»Ø¸øÓû§µÄÏûÏ¢±»´«Èëµ½ÏìÓ¦¶ÔÏó¡£

ÕâÊÇÒ»¸ö·Ç³£¼òµ¥µÄÀý×Ó£¬µ«ÒѾ­Çå³þµØËµÃ÷¡°ÕæÕýµÄÓ¦ÓóÌÐò¡±ÈçºÎÀûÓÃÕâ¸ö¿ò¼ÜÀ´¹¹½¨¸ü¼Ó·á¸»ºÍÍêÕûµÄ¹¦ÄÜ¡£Èç¹û²åÈëÒ»¸öÄ£°åϵͳºÍһЩÊý¾ÝÒýÇæ£¨´«Í³µÄ»ò NoSQL ¾ù¿É£©£¬Äú¿ÉÒÔÇáËɹ¹½¨³öÒ»×鹦ÄÜÀ´Âú×ãÕæÕýÓ¦ÓóÌÐòµÄÐèÇó¡£

Express µÄÌØµãÖ®Ò»ÊǸßÐÔÄÜ¡£ÕâÓëÆäËû¿ìËÙ Web Ó¦ÓóÌÐò¿ò¼ÜµÄ³£¼ûÌØÐÔÒ»Æð£¬Èà Express ÔÚ×¢ÖØ¸ßÐÔÄܺͺ£Á¿¿ÉÉìËõÐÔµÄÔÆ²¿ÊðÁìÓòÖÐÕ¼¾ÝÁËÖØÒªµÄλÖá£

Ó¦Á˽âµÄ֪ʶ

ÓÐÁ½¸ö¸ÅÄî/Ç÷ÊÆÐèÒªÁ˽⣺

1.¼ü/ÖµÊý¾Ý¿âµÄͻȻÁ÷ÐС£

2.ÆäËûÒì²½µÄ Web ·¶ÐÍ¡£

¼ü/ÖµÊý¾Ý¿â... ΪʲôͻȻÁ÷ÐУ¿

ÒòΪ JavaScript ÊÇ Web µÄͨÓÃÓïÑÔ£¬¶ÔÓÚ JavaScript Object Notation (JSON) µÄÌÖÂÛͨ³£Ô¶Ô¶ÂäºóÓÚ JavaScript Ïà¹ØµÄÑо¿¡£

JSON ÊÇÔÚ JavaScript ÓëһЩÆäËûÓïÑÔÖ®¼ä½»»»Êý¾ÝµÄ×î³£ÓÃ;¾¶¡£JSON ±¾ÖÊÉÏÊÇÒ»ÖÖ¼ü/Öµ´æ´¢£¬Òò´ËÌìÉúÊÊÓÃÓÚ¶Ô¼ü/ÖµÊý¾Ý¿â¸ÐÐËȤµÄ JavaScript ºÍ Node.js ¿ª·¢ÈËÔ±¡£±Ï¾¹£¬Èç¹ûÄܹ»ÒÔ JSON ¸ñʽ´æ´¢Êý¾Ý£¬JavaScript ¿ª·¢ÈËÔ±µÄ¹¤×÷¾Í½«±äµÃÇáËɺܶࡣ

ÓÐÒ»¸ö²»Ì«Ïà¹ØµÄÇ÷ÊÆ£¬ÔÚ NoSQL Êý¾Ý¿â»·¾³ÖÐÒ²»áÉæ¼°¼ü/ÖµÊý¾Ý¿â¡£CAP ¶¨Àí£¨Ò²½Ð×ö Brewer ¶¨Àí£©Ö¸³ö£¬Ò»¸ö·Ö²¼Ê½ÏµÍ³ÓÐ 3 ¸öºËÐÄÊôÐÔ£º Ò»ÖÂÐÔ¡¢¿ÉÓÃÐԺͷÖÇøÈÝÈÌÐÔ£¨formal proof of CAP£©¡£ ÕâÌõ¶¨ÀíÊÇ NoSQL ·¢Õ¹±³ºóµÄÍÆ¶¯Á¦Á¿£¬ËüΪÎþÉü´«Í³¹ØÏµÊý¾Ý¿âµÄÄ³Ð©ÌØÐÔÒÔ»»È¡£¨Í¨³£ÊǸ߿ÉÓÃÐÔ£©ÌṩÁËÀíÂÛ»ù´¡¡£Ò»Ð©Á÷Ðеļü/ÖµÊý¾Ý¿â °üÀ¨ Riak¡¢Cassandra¡¢CouchDB ºÍ MongoDB¡£

Òì²½ Web ·¶ÐÍ

ʼþÇý¶¯µÄÒì²½ Web ¿ò¼ÜÒѾ­´æÔÚÁËÏ൱³¤Ò»¶Îʱ¼ä¡£ÆäÖÐ×îÁ÷ÐкÍ×îеÄÒì²½ Web ¿ò¼ÜÊÇ Tornado£¬ËüʹÓà Python ÓïÑÔ±àд£¬ÔÚ Facebook ÄÚ²¿Ê¹ÓᣠÏÂÃæÕâ¸öÀý×Ó˵Ã÷ÁË hello_world ÔÚ Tornado ÖУ¨ÔÚÏÂÔØÊ¾ÀýÎļþÖнÐ×ö hello_tornado.py £©ÊÇʲôÑù×Ó¡£

import tornado.ioloop
import tornado.web

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("Hello, world")

application = tornado.web.Application([
    (r"/", MainHandler),
])

if __name__ == "__main__":
    application.listen(8888)
    tornado.ioloop.IOLoop.instance().start()

Twisted.web Ò²ÊÇÓà Python ÓïÑÔдµÄ£¬¹¤×÷·½Ê½Ò²Ê®·ÖÀàËÆ¡£

×îºó̸µ½ÕæÕýµÄ Web ·þÎñÆ÷±¾Éí£¬Óë Apache ²»Í¬£¬nginx ²»Ê¹ÓÃỊ̈߳¬¶øÊÇʹÓÃÒ»ÖÖʼþÇý¶¯µÄ£¨Òì²½£©¼Ü¹¹À´´¦ÀíÇëÇó¡£ Òì²½ Web ¿ò¼ÜʹÓà nginx ×÷ΪÆä Web ·þÎñÆ÷ÊÇÊ®·Ö³£¼ûµÄÇé¿ö¡£

½áÊøÓï

Node.js ÔÚ Web ¿ª·¢ÈËÔ±Öзdz£ÒýÈ˹Ø×¢¡£ËüÔÊÐí¿ª·¢ÍŶÓͬʱÔÚ¿Í»§¶ËºÍ·þÎñÆ÷¶ËÉϱàд JavaScript¡£ ËüÃÇ»¹¿ÉÒÔ½áºÏÓë JavaScript Ïà¹ØµÄÇ¿´ó¼¼Êõ£ºJQuery¡¢V8¡¢JSON ºÍʼþÇý¶¯µÄ±à³Ì¡£ ÁíÍ⻹ÓлùÓÚ Node.js ¿ª·¢µÄÉú̬ϵͳ£¬±ÈÈç Express Web ¿ò¼Ü¡£

Node.js µÄÓŵãÒýÈ˹Ø×¢£¬ËüÒ²´æÔÚһЩȱµã¡£Èç¹ûÊÇ CPU Ãܼ¯Ðͱà³Ì£¬¾ÍÎÞ·¨ÌåÏÖ Node.js ÌṩµÄ·Ç×èÈû I/O ·½ÃæµÄÓŵ㡣 ÓÐЩ¼Ü¹¹¿ÉÒÔ½â¾öÕâÀàÎÊÌ⣬±ÈÈ罫һ¸ö³ØÖеĽø³Ì·ÖÁ÷µ½Ã¿¸ö Node.js ʵÀýÉÏÔËÐУ¬µ«ÐèÒªÓÉ¿ª·¢ÈËԱȥʵÏÖËü¡£

   
2340 ´Îä¯ÀÀ       27
Ïà¹ØÎÄÕ Ïà¹ØÎĵµ Ïà¹Ø¿Î³Ì



Éî¶È½âÎö£ºÇåÀíÀôúÂë
ÈçºÎ±àд³öÓµ±§±ä»¯µÄ´úÂë
ÖØ¹¹-ʹ´úÂë¸ü¼ò½àÓÅÃÀ
ÍŶÓÏîÄ¿¿ª·¢"±àÂë¹æ·¶"ϵÁÐÎÄÕÂ
ÖØ¹¹-¸ÄÉÆ¼ÈÓдúÂëµÄÉè¼Æ
Èí¼þÖØ¹¹v2
´úÂëÕû½àÖ®µÀ
¸ßÖÊÁ¿±à³Ì¹æ·¶
»ùÓÚHTML5¿Í»§¶Ë¡¢Web¶ËµÄÓ¦Óÿª·¢
HTML 5+CSS ¿ª·¢
ǶÈëʽC¸ßÖÊÁ¿±à³Ì
C++¸ß¼¶±à³Ì
×îл¼Æ»®
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢ 6-12[ÏÃÃÅ]
È˹¤ÖÇÄÜ.»úÆ÷ѧϰTensorFlow 6-22[Ö±²¥]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 6-30[±±¾©]
ǶÈëʽÈí¼þ¼Ü¹¹-¸ß¼¶Êµ¼ù 7-9[±±¾©]
Óû§ÌåÑé¡¢Ò×ÓÃÐÔ²âÊÔÓëÆÀ¹À 7-25[Î÷°²]
ͼÊý¾Ý¿âÓë֪ʶͼÆ× 8-23[±±¾©]

AndroidÊÖ»ú¿ª·¢£¨Ò»£©
Àí½âJavascript
·ÇµäÐÍajaxʵ¼ù
³¹µ×µÄAjax
javascript ʹÓÃCookies
ʹÓà jQuery ¼ò»¯ Ajax ¿ª·¢


Struts+Spring+Hibernate
»ùÓÚJ2EEµÄWeb 2.0Ó¦Óÿª·¢
J2EEÉè¼ÆÄ£Ê½ºÍÐÔÄܵ÷ÓÅ
Java EE 5ÆóÒµ¼¶¼Ü¹¹Éè¼Æ
Javaµ¥Ôª²âÊÔ·½·¨Óë¼¼Êõ
Java±à³Ì·½·¨Óë¼¼Êõ


ijº½¿Õ¹«Ë¾IT²¿ JavaScriptʵ¼ù
ijµçÊÓÈí¼þ HTML5ºÍJavaScript
Öк½ÐÅ JavaScript¸ß¼¶Ó¦Óÿª·¢
´óÇìÓÍÌï web½çÃæAjax¿ª·¢¼¼Êõ
ºÍÀûʱ ʹÓÃAJAX½øÐÐWEBÓ¦Óÿª·¢