KEVIN Schmid: Hej alla. Välkommen till CS50 seminariet på Node.js. Mitt namn är Kevin. Jag är en CS50 TF. Och jag är ungefär som verkligen glada om det här seminariet. Jag tror Node.js är väldigt cool. Jag hoppas att det här seminariet kan användas som en bra, antar jag, språngbräda för några av dina sista projekt IF du är intresserad av att använda något som Node.js. Vi sorts börjar seminariet av av bara talar om en liten bit av den typ av bakgrund skalbarhet perspektiv Node.js, och sedan Vi ska flytta till några kodexempel. Och jag har koden på en webbsida, och du kan titta på koden. Och efter seminariet, jag sorterar prat om hur du kan ställa in Node.js på din dator. OK. Så låt oss komma igång. Så jag antar att jag vill bara prata om webbservrar, verkligen, först. Och att starta denna diskussion, jag i grund och botten har ett diagram som är från läroboken används för CS61, som i grund och botten visar interaktionen mellan en klientprocess, som din webb webbläsare eller liknande ditt mål klient eller något liknande, och en webbserver. Så denna typ av liknar det bild som du såg i föreläsning om Onsdag var i grund och botten har vi några klientprocess som Google Chrome. Och sedan steg ett är klienten skickar en förfrågan. Så det kan vara något som väl låt oss besök, jag vet inte, CS50.net. Så vi utfärdar denna begäran. Och det någon som kommer ihåg namnet på det protokoll som anger hur det begäran bör struktureras? Yep. PUBLIK: [OHÖRBAR]. KEVIN Schmid: Exakt. Så det är som HTTP, eller hur? Så i princip specifikationen för hur denna begäran borde egentligen läggas ut, eftersom i slutet av dagen, att begäran är egentligen bara gillar en sträng som i grund och botten säger att jag vill ha det. Och specifikationen för det är HTTP. Så det är som ett protokoll. Så då servern tar emot denna begäran. Så ni har en webbserver installerad i CS50 apparaten. Det är Apache. Och denna vecka när du arbetar på problemet satt sju, kommer du verkligen att arbeta med den webbserver. Så servern tar emot denna begäran, och då måste det slags repa sin huvud och säga som väl vad gör jag med detta? Så baserat på vad den bestämmer sig för att göra, då det kan ha att kontakta någon form av resurs. Och som resurs kan vara en massa olika saker. För en, kan det vara precis som en statisk HTML-fil. Så det skulle bara vara som en HTML som är som för din personliga hemsida. Det kan vara en statisk fil som en bild eller som en film som du har. Det kan till och med prata till någon form av databas som en MySQL-databas. Så det behöver inte alltid kommunicera med en resurs, men i vissa fall kunde det. Så vad det kommer att göra efter det är att det kommer att sända tillbaka svaret. Och svaret till detta är också anges av HTTP. Så då kunden kan ta emot det. Det kan slita isär den och bearbeta den. Och sedan får du en webbsida som Google eller CS50.net eller vad du gick till. OK? Så detta är den grundläggande samverkan som vi kommer att ha att göra med. Och vi är ganska mycket att vara fokuserar på denna del av interaktion, servern. OK. Cool. Någon som har några frågor så här långt? OK. Så som sagt, får webbservern denna HTTP-begäran och sedan utfärdar detta HTTP-svaret. Och som vi talat om tidigare, det CS50 apparat webbserver är Apache. Så när ni arbetar på P set sju, du kommer att arbeta med den Apache webbserver. Du behöver aldrig riktigt arbeta med Apache direkt för mycket. Du sorts konfigurera Apache lite När du anger de virtuella värdar eller v värdar och vi kommer att få som i en liten bit. Men i grund och botten, webbservern Apache inrättats för att arbeta med PHP slag av ur lådan. Så vad som verkligen händer är när du går till en av dina webbplatser som, säg, lokala värden snedstreck index.php eller något, är webbläsaren skickar det begäran, och sedan Apache sitter där och räknar ut att göra med det. Och det händer att verkställa den koden i index.php och sedan skicka det tillbaka. Så det är det. Så vi liksom pratat om det här. Så det skulle bara tjäna en statisk fil eller köra några PHP-kod och sedan fråga svaret. Så då en vanlig fråga som kan komma upp är bra, hur ska vi egentligen handlar med att ha flera användare på samma gång? Så tänk om du skrev en webbsida server, om du hade en webbserver som du försökte skriva in något som C eller något liknande, i princip kan man tänka på hur det skulle kunna vara någon form av kod som skulle få en begäran, men sedan det har att göra allt detta arbete på det. Det kan ha att exempelvis kontakta databas eller något liknande. Rätt? Och då skulle det göra den typen för bearbetning och därefter skickas tillbaka svaret. Så det är som den höga nivå översikt. Men det är inte omedelbart uppenbart hur du kan göra det så att två personer eller till och med 1000 personer skulle kunna arbeta med din webbserver på samma gång. Så lösningen som Apache använder kallas trådar eller processer. Så du kanske har hört talas om dessa termer innan. Det är OK om du inte har, men tänk bara om ämnen eller processer som sätt för ett operativsystem eller ett användarprogram eller något liknande eller en webbserver att sorts exekvera flera saker samtidigt. Så du kanske har hört termen liknande trådar av avrättning. Så det är ungefär som att du är sorts multitasking. Och om du har sett på rutan på din laptop, eller något liknande, Multicore, vad du kan göra är att du kan köra två olika trådar på olika delar av CPU så att de kan faktiskt hända på samma gång. Så det här är verkligen kraftfull. Och detta är typ av Apaches lösning på detta problem. Så är det ungefär som eventuella problem med denna metod men? Så jag antar att jag liksom skrev dem där. Men båda slags använder mycket minne. Det är väldigt dyrt att skapa en tråd eller en process. Och en del av resonemanget är att bara som när du kör ett C-program som din främsta och sedan att samtal en annan funktion, har det någon form av stapeln. Så gängor kräver också en helt separat stapel som kan vara ganska stora. Och om du kan tänka dig att ha massor av användare på din webbplats, skulle du ha en massa olika trådar. Det är en hel del högar med hantera och underhålla. Så det är stor minnesförbrukning. Och sedan, också, låt oss säga att du bara har en processor, eller låt oss säga att du har fler ämnen än vad du har dessa multicores. Rätt? Så låt oss säga att du hade 10 trådar och du bara hade fem processorer. Du slags måste göra denna sak där du växlar mellan aktuell en som körs för att du kan inte köra alla 10 på en gång. Och det kallas ett sammanhang switch. Och det ordet har faktiskt ett par olika sammanhang, men låt oss bara se det som att byta mellan två trådar. Det kan vara ganska dyrt eftersom i princip vad du behöver göra är att du måste sluta vad du gör, spara tillståndet i det rinnande tråd, och sedan byta till någon annanstans. Så gör alla slags ser motivation varför trådar och processer kan vara lite klumpig? Och har du en fråga? OK. Cool. Någon som har några frågor? OK. Så om vi tar ett steg tillbaka för en andra, Det är ungefär som en iakttagelse som vi kan göra om mycket av webbapplikationer. Och det är verkligen att en hel del av dem egentligen inte gör så mycket nytta arbeta inuti av en gänga. Så har någon börjat på P satt sju alls? Så vill du kanske beskriva vissa av delarna? Har du arbetat med inloggning eller något liknande? PUBLIK: Nej. KEVIN Schmid: OK. Aldrig sinne. Ursäkta. Men i grund och botten, i P-set, du kommer att göra en massa slags frågor till en databas för att få lite information från databasen. Och vad din kod kommer att göra, vad som Apache process eller att Apache tråd kommer att göra samtidigt som den har att kontakta Databasen är det slags att vara sitter där och det kommer att bli väntar på databasen för att svara. Nu kanske inte låter som så stor hantera eftersom databasen på CS50 apparaten, eller hur? Men det finns någon form av nätverk latens där eftersom nu på webben server måste avge sin egen begäran databasen för att kommunicera med databas och sedan få det information tillbaka. Så nu är det som väl vänta på mig, jag är ska gå och hämta något från databas och sedan finns det en Många väntar på gång. Låter det vettigt? Och för vissa saker är det inte så illa. Om det bara måste, till exempel, minne, det är inte som hemsk I / O-latens. Och när jag säger, I / O-latency, vad jag är syftar på är som någon form av liknande input output. Men för att komma åt en fil på disken, som om jag ville tjäna den statiska HTML fil som var på min webbsida eller något liknande, jag slags måste stanna för lite, läsa den filen in från disken, och sedan i den processen jag väntar. Jag gör ett viktigt arbete. Detta är inte sant av allt, men det är vanliga i tillämpningar som P set sju och en hel del program att du inte är faktiskt gör mycket tänkande. Och när jag säger tänkande, menar jag som beräkningsarbete. Så beräkningsarbete kan vara något som, säg, du ville skriva en webbserver som just beräknats den n: te Fibonacci nummer. Det låter inte som en särskilt kul webbserver. Som om jag skulle inte förvänta sig att webbplatsen ska vara nästa Facebook, men det finns en viss typ av beräkningsarbete. Och du kan tänka dig att byta ut det med någon annan typ av intressant beräkningsarbete. Låt oss säga att du skrev något som beräknade graderna åtskillnad mellan två personer eller något liknande. Så det inte innebära någon form beräkning, eller hur? Och även då, att göra att du fortfarande har att göra en hel del väntar på kanske du måste fråga en databas för att se upp vem som är vän med vem eller något liknande. Så det är den typen av begrepp av beräkningsarbete. Låter det vettigt? Är det någon som har några frågor? Åh, och jag antar att jag satte chattservrar där eftersom chattservrar är typ av ett annat bra exempel på detta. En chatt-server har inte att göra mycket tänkande. Det har bara att vänta för människor att skicka meddelanden och sedan när de gör, skicka dem. OK? Så bara för att sammanfatta igen, Apache och liknande webbservrar så där gaffel a Många trådar och processer som kan vara typ av slöseri. Så jag antar att den fråga som kan komma från det är behöver vi ha flera trådar och processer? Tänk om vi bara hade en? Så låt oss slags måla en bild av vad detta skulle se ut. Så låt oss använda en enda tråd. OK? Så bara föreställa mig detta med en tråd. Låt oss anta att vi inte riktigt gör att mycket användbart - och när jag säger användbar, menar jag beräkningsarbete - i de flera trådar innan. Så låt oss slags konsolidera allt i en tråd. Så vad händer om vi hade en tråd som slag av bara går runt i en slinga och ständigt kontroller gjorde något ny hända. Så till exempel, något nytt har hänt kan betyda Jag fick något tillbaka från databasen, eller någon skickade mig en ny HTTP-begäran. Så de är typ av händelser att hända, eller hur? Och vad jag kan göra när de nya saker händer är i samma tråd om verkställighet, denna enda tråd av utförande, kan jag ringa någon kod som skulle hantera just den saken. Så till exempel, om jag fick något tillbaka från databasen, kan jag köra min liten beräknings del av det som faktiskt bara förbereder sak att skicka tillbaka till användaren. Det gör den typen av vettigt? Men vad är egentligen den konsekvenserna av detta? Rätt? Eftersom vi har skrivit en hel del kod som - och jag ska bara hoppa framåt i bilderna om det är OK. Så om du inte har något emot, jag är bara kommer att ta ett steg tillbaka. Så denna typ av sak är kallas en händelse slinga. OK? Och det är lite av den grundläggande Tanken bakom Node.js. Så vad Node.js egentligen gör som en webbsida server är att det finns en enda tråd som är i princip gå runt i en slinga som en stund ett slags enligt huven på Node.js som är ständigt kontroll, vi får nya saker? Och då kommer den att köra truck att du ställer upp. Men en bra fråga att ställa är, hur kan vi göra detta med befintliga saker? Så jag satte en rad av C-kod här att i princip ser ut som det öppnar en fil, eller hur? Jag Hon bara kom ut med ett album. Så jag var tvungen att öppna henne en ny fil. Så hur vår C-kod för drift - och jag antar att anledningen till att jag valde filer var eftersom det är typ av i vilken utsträckning av I / O-arbete som vi har gjort i C i en känsla av att det finns input output. Vi kallar denna kod som gör detta f öppen. Och sedan på nästa rad i vår program, kan vi nu arbeta med f.. Så det här skulle vara ett exempel på något det är som synkron eller blockering på grund på den första raden där vi väntar tills vi få filen öppen. Så på den andra raden, vi vet att vi kan arbeta med f, men detta innebär att den andra raden kan inte riktigt köra tills den första raden är klar. Låter det vettigt? Så det här skulle vara dåligt att sätta i en händelsehanterare. Och anledningen till det är att denna typ av väntetider, eller hur? Så detta skulle återgå oss tillbaka till samma sak. Och nu har vi inte ens skulle ha Fördelen med flera trådar eller processer för att vi fick en tråd i Node.js. Är det vettigt att alla? PUBLIK: Vänta. Så vad är ersättare? KEVIN Schmid: Åh, så ja. Så jag kommer att komma till ersättare. OK. Så vad händer om vi hade något som såg ut så här? Så vad händer om nu jag redigerade f öppna lite? Så jag går i samma två argument som tidigare. Jag älskar fortfarande den nya låten att hon kom ut med. Men jag passerar en tredje sak som är denna variabel som heter kod. Men vad är koden faktiskt i detta sammanhang? Är det som en vanlig C-variabel? Det är en funktion, eller hur? Och det kan vara lite konstigt eftersom Jag är faktiskt som nu passerar en fungera i en annan funktion. Så ett par saker att notera om detta. Ett, jag faktiskt inte ringa koden fungerar. Så du inte ser koden med vänster paren, rätt föräldra. Jag bara passerar i kod. Och i C, vad detta skulle faktiskt göra är att ge mig en pekare till det faktiska kod, och då detta skulle kunna köra den. Men bara tänka på det som du är passerar kod körs när att filen öppnas. Men vad det betyder är att nu Resten av mitt program som kan göra andra saker, kan fortsätta att göra andra grejer medan vi, inte riktigt vänta, men bara har på baksidan av huvudet som När filen är öppen, kör som kod på toppen. Låter det vettigt? Och nu tanken bakom Node.js är att koden i göra-grejer med f del bör vara ganska kort och enkel och rättfram och inte riktigt vara mycket beräkningsintensiv. Det kan ha att öppna en annan fil, men det bör också vara ganska snabb eftersom det skulle bara säga göra en f öppna och sedan kalla detta annan kod. Så bara för att vara helt klar, den f Öppna som gör den nya Katy Perry sång gjort mp3, det kommer att ganska mycket tillbaka omedelbart. Och då kan vi bara fortsätta att göra andra saker eftersom allt som nu f öppen inbjudan gör är att berätta i stort sett underliggande f öppen kod öppna filen och när du är klar öppnar detta fil eller när du får tillbaka den, sedan köra koden. Men det gör faktiskt inte köra den koden. Och du hade en fråga? PUBLIK: Du verkade antyda några gånger att lägga beräknings intensiv kod slags bryta [OHÖRBAR] drivet system. [OHÖRBAR]? KEVIN SCHMID: Det är en bra fråga. Så jag har faktiskt ett exempel på hur du kan integrera beräknings intensiv kod i en liten bit. Så när vi kommer till kodexempel, Jag ska se till att dra den. Är det OK? Tack. Vad var ditt namn? PUBLIK: Aaron. KEVIN SCHMID: Aaron tar upp en mycket bra poäng, vilket är att om jag hade vissa beräkningsintensiva koden i att göra saker med f delen, resten av mitt program kan inte köras och kan inte lyssna för nya ansökningar eller något tills alla det där är klart. Så om jag skriver Node kod i allmänhet om vi inte gör något som jag ska att föreslå senare när vi tittar på kodexempel, jag måste vara säker på att min kod inte binda upp denna händelse slinga. Låter det vettigt? OK. Cool. Så Node.js erbjuder denna ram som du kan bygga dessa händelsestyrda servrar med. Så det har denna typ av asynkron icke-blockerande I / O-bibliotek, medan de vanliga C-bibliotek som vi har varit arbetar med, som om du bara använda dem på samma sätt som vi har använt dem med f öppnas och grejer, de som blockerar eftersom du faktiskt har att vänta på den fil som ska öppnas. Men Node.js ger dig det och det princip knyter i Googles V8 JavaScript-motor, som är anledningen till att Chrome är så snabb vid bearbetning JavaScript eftersom det har denna V8-motor. Så jag vet att det låter som en av de WWDC utvecklare konferenser sak där de bara kasta en massa av brev antal saker för processorer och säger att det här är så coolt. Men det är coolt att de gjorde detta eftersom JavaScript - eller kanske om du inte är bekant med JavaScript än eftersom vi inte har haft föreläsningarna på det - men JavaScript är ett tolkat språk. Och detta är en viktig punkt också. Så det är viktigt för vår servrar att vara snabb, eller hur? Och om vi bara kör JavaScript kod som tolkades med bara alla gamla tolk kan det vara långsam. Så Node fördelar av att ha detta supersnabb V8 tolk. Och jag vet inte om de heter det eftersom V8 slag i pannan sak, men OK. Så jag har förberett några exempel på denna webbadress. Efter seminariet, jag slags gå till tala om hur du kan få Node set upp, men för nu, jag bara typ av vill att gå igenom några kodexempel. Så om du vill följa med, hela källkoden finns tillgänglig där. OK? Så jag lämnar denna URL upp för lite. Och då jag ska bara växla in i terminalen. Är alla bra med denna URL? Så jag kommer att gå över till min terminal här. Så här är den kod som Jag har för idag. Varför gör vi inte börjar med simpler.js fil? Den andra saken är att allt detta kod ska skrivas i JavaScript som du kan eller kanske inte är bekant med. Jag antar att ett par saker är att en hel del JavaScript-kod är den typ av syntax och struktur är mycket lik C, så du kan slags plocka upp det som du går längs. Jag har försökt att skriva en hel del av start kod för detta på ett sätt som är liknar C så att det är lite mer lättläst. Men som vi framsteg, jag ska vara visar några av de ytterligare funktioner i JavaScript som är ganska häftigt. Men låt oss titta på det här provprogram. Jag antar att allt är avskuren där. Jag ska bara fixa det verkliga snabbt om det är OK eller inte. Jag vet inte vad detta kommer att göra. Är det lite bättre? Kan du se var och grejer? OK. Så den första raden är som JavaScript version av en variabel deklaration. Så bara för att belysa vad detta skulle se ut i C. Så det här är precis som mig att säga index lika med tre eller något liknande. Så jag inte ange vilken typ. JavaScript har typer, men det är mycket dynamiskt skrivit i naturen, så gav inte någon form av typ på det. Så det har bara var. Det är som variabel. OK? Och jag ringer denna variabel HTTP. Och på min högra sida, jag har uttryck som jag vill sätta i HTTP. Och detta säger kräver HTTP. Så det här är ganska lik inkludera. Det är lite mer som kraftfull än inkluderar i den meningen att inkludera skulle bara kopiera och klistra in huvudet filen för funktionsprototyper eller vad med typ definitioner. Men kräver faktiskt går att få oss koden. Så du kan se det som importerar lite kod. Så någonstans i Node.js modul systemet eller vad, de har allt detta HTTP-serverkoden så jag är bara hämta det för min egen personligt bruk i detta program. OK? Så då jag har denna funktion som jag har skrivit. Och märker jag behövde inte ange returtypen eller typen av argumenten igen. Så slags lös skrivit i den typen av känsla. Två argument som det tar in, begäran och svar. Så det är begreppsmässigt ungefär som bekant från den bild som vi hade på skärmen innan eftersom vi får denna begäran som vi har från användaren. Och sedan har vi ett svar som Vi kan skriva saker till. Så den första raden i detta gör res.writeHead 200 och sedan detta innehållstypen text plain. Så låt oss pussla detta isär lite. Så låt oss bara fokusera på res.write för lite. Så skriver är i grund och botten, och skriva huvudet, är bara olika sätt att sorts skriva ut saker till svaret. OK? Så skriv huvudet, om någon kommer ihåg från HTTP-föreläsning, gör ni minns rubriker på toppen av HTTP sak? Så varför jag inte demo bara headers riktigt snabbt. Skulle det vara till hjälp? Eller ska vi bara sorts - OK. Visst. Så när webbläsaren går till google.com eller något liknande, det finns faktiskt lite mer - detta är som en hemlighet - Det är som en lite mer information som kommer genom röret än bara den liten sökning och allt. Så visa det här, jag ska att använda ett program som heter Curl. OK? Så detta är något som du kan köra på ditt kommando Mac OSX linje eller i apparat eller något annat. Och så om jag Curl HTTP google.com, Jag kommer att se HTML. Och detta är, i rättvisans namn, precis HTML den sortens säger åt dig att omdirigera till www om din webbläsare inte automatiskt hantera omdirigering. Så det här är bara HTML, men jag ska att lägga till Curl detta bindestreck flaggar jag. OK? Och detta kommer att visa mig rubrikerna. Så detta är också information som kommer igenom när jag får detta svar. OK? Så högst upp, ser du det här HTTP 301 flytta permanent. Och det är ganska viktigt eftersom det rör sig om statuskoden. Så 301 här är statuskoden, vilket egentligen bara ett heltal som talar om för webbläsaren eller den som är läser detta, om du låtsas att du är en webbläsare och du ser det här, princip nu om man tittar på det och du ser en 301, du vet att jag har att göra något speciellt utifrån 301, eller något speciellt hände baserad på 301. Så det säger flyttat permanent. Och sedan, i princip, har vi ett gäng nyckelpar värde. Så vi får plats är www.google.com. Och sedan typ av allt det här andra grejer, men i grund och botten, vad platsen är säger är den nya platsen är på www.google.com. Så nu om du går till google.com, kommer du slags se webbläsarens typ av blink för en sekund och sedan omdirigera dig tillbaka till www.google.com. Så svaren kan innehålla dessa rubriker. Och ett par saker att påpeka. Så låt oss säga att vi var verkligen lyckat i att besöka en webbsida. Så låt mig gå till - vad är en bra hemsida? Jag är dålig på att tänka på bra webbplatser på plats. PUBLIK: Wikipedia. KEVIN Schmid: OK. Låt oss göra Wikipedia. Så här jag blev rörd. Åh vänta. Var jag? Ja, det var jag. OK. Så jag fick göra www. Så jag ska göra www. Och som ni kan se, här är all HTML att webbläsaren skulle bearbeta för Wikipedia. Men om jag fortsätter att rulla upp här, vad jag ser i toppen - wow, det finns en hel del HTML på Wikipedia - men vad jag kan se i toppen här är detta 200 statuskod som motståndare till 301 som jag såg tidigare. Och märker att det har en fin vänlig OK bredvid den. Så det här är som den goda statuskod. Betyder det 200 nummer bekant? Ja, därför att när jag gjorde simpler.js, Jag skrev en 200 där. Så det är i grund och botten säger berätta webbläsaren eller den som försöker få till detta att de var framgångsrika. Eller det ungefär som vi var framgångsrika också. Och det är denna typ av särskild syntax i Javascript för att förklara en karta över dessa tangenter som innehållstyp och dessa värden som text plain. Så om du tittar på det svar som vi kom tillbaka från Wikipedia innan, - Jag ska försöka att rulla upp lite snabbare - du har dessa nycklar som servern och dessa värden Apache. Så du har fått nycklar och värden. Och du kan ange detta i Nod vad att skicka tillbaka. Så det här är faktiskt ganska, i vissa sätt, och på vissa sätt är det inte egentligen, men det är lite lägre nivå än den PHP-kod som du kan vara skriva för P satt sju eftersom PHP och Apache sorts ta hand om några av dessa saker för dig. I PHP, kan du åsidosätta standard beteende genom att skriva egna rubriker. Men för tillämpningen av denna, får vi för att skriva ut våra egna huvuden. Så gör den linjen vettigt att alla, skrivhuvudlinjen? OK. Awesome. Så vad jag gör är att jag avslutar svaret genom att säga hej världen. OK. Men det är bara en funktion kallad begäran handler. Så nu har jag faktiskt måste slags göra något med den här funktionen, eller hur? Så här det jag gör är att det är här linje som gör var-server lika HTTP.create server, och sedan jag passera i begäran hanteraren. Så det här är typ av nod sätt att skapa en server. Och märker att jag passerar i begäran-hanteraren. Så detta är träffande createServer funktion som jag vill att du ska göra mig en server, och när servern tar emot ett svar, jag vill att du ringer det här begära hanterarfunktionen. OK? Så att linje ganska mycket avslutar direkt. Så det var serverlinjen är gjort rätt efter att du gör det ganska mycket. Jag menar, det måste ställa in vissa interna tillstånd för att veta att du måste kallar denna begäran hanterarfunktion, men det kommer inte att sitta där och säg har användaren skickas mig en förfrågan ännu? Har användaren skickade mig en förfrågan ännu? Så den inte blockerar. OK? Så vad detta kommer att göra är det i grund och botten nu lagrar en pekare till denna kod, denna begäran hanterarfunktion, och sedan kommer att köra den koden när någon gör en förfrågan. Och sedan gör vi server.listen. I 1337 finns det ganska godtyckligt. Jag hade ingen särskild anledning för att plocka det numret. Det var helt slumpmässigt. Men som bara anger porten. Så de flesta webbservrar så ser du att de använda port 80, eftersom det är typ i likhet med konventionen. Så om jag går till något liknande, Jag vet inte, Wikipedia.org, och jag satte kolon 8 - Oh wow, du kan inte se det. Jag är ledsen. Men om jag gör Wikipedia - Jag skriver det här bara så att det är klart på kameran. Men om jag tar detta i en webbläsare med ett kolon 80, som anger att gå till Wikipedia.org på port 80. Så det är som hur USA har flera portar som var du kan skicka saker för sorts. Så det är som att gå till just denna plats på den här servern. OK. Så jag valde just 1337. Det finns en hel rad siffror att du kan välja. Det var inte helt speciell. Men vad jag ska göra nu är jag ska köra nod. Låt mig verkligen ange att ett par rader ner så att du kan se det. Jag kommer att göra Node, och jag är kommer att köra simpler.js. Och vi kommer att prata om hur man får Nod inrättades en liten bit. Men nu är det bara att köra på servern. Så en sak som vi kan prova som inte får vara så spännande är att vi faktiskt kan försöker komma åt den i Curl. Så jag kan göra Curl, och min Maskinen är lokala värden. Du ser också denna skriftliga så här ibland. Lokal värd och 127.0.0.1 är snäll av som din hemdator. Så det är som att prata med din egen dator. OK. Och då kan jag säga 1337. Så om jag kör denna rad kod, den säger hallå världen. Och om jag ville se det där som hade innehållstyp text vanligt eller vad som helst, jag kan till och med sätta detta här. Och märker att det står OK. Och jag har text plain. Och så är det typ av allt det här andra saker som Node kommer att lägga in där för mig. Det är inte super viktigt. Jag menar, det finns någon form av teknisk aspekter på som är snäll coolt att prata om, men bara för att visa du, jag har också befogenhet att ändra dessa runt. Så jag kan bara lägga till ett gäng av sånt. Och så nu, om jag tittar i min utgång, kommer det att vara så. Så dessa rubriker gör vissa saker till webbläsare och sådana saker. Och rubriker kan i princip säga en webbläsare hur man ska reagera på någonting. Om du någonsin har hört talas om cookies innan, eller om du någonsin har varit irriterad genom en webbsida inställning kakor, eller aktiverat cookie-block eller något liknande. Du kan faktiskt ställa cookies i dessa huvuden. Så de berättar en webbläsare hur man beteende i vissa fall. OK. Så det var simpler.js. Är det någon som har några frågor på att källkoden filen? OK. Cool. Så låt oss ta bort r från det och titta på simple.js. Så det här är ganska mycket samma program. Jag bara skrev det lite annorlunda eftersom jag ville att sortera på markeringen vissa funktioner i JavaScript. Så märker att begäran-hanteraren Funktionen har helt försvunnit. Oh ja, fick du en fråga? Publik: Ja, argumenten som bringas att passera till det funktion, vad är de? KEVIN SCHMID: Så de är JavaScript-objekt. I Node.js dokumentation, det princip säger vilka metoder är som finns på dem. Vi råkar bara ha tillgång till Denna metod kallas för skrivhuvudet och slutet och sånt. Men det finns en hel drös fler metoder. Och till exempel, som en av dem särskilt på rec, kan du göra något liknande rec.method som kommer berätta om det är en HTTP få eller HTTP POST-begäran och sånt. Så det finns alla typer av olika egenskaper, men de är båda JavaScript-objekt, och de bara har funktioner knutna till dem att du kan skriva saker till. OK? Så märker att begäran handler är helt borta. Men den kod som jag hade i begäran handler är fortfarande där. Jag har fortfarande denna res.writeHead och jag har fortfarande denna res.end. Och vad det här är ett exempel på JavaScript är denna idé om en anonym funktion. och anonym är som ett passande namn för det eftersom det bokstavligen inte ha ett namn. Det finns ingen begäran funktion hanteraren i där. Har inget namn, men det är fortfarande är att ta ett argument. Så jag fick fortfarande rec och res. Och jag har fortfarande koden. Detta är alldeles utmärkt JavaScript-kod. Så jag kan deklarera en funktion utan uttryckligen ge den ett namn. Det är lite förvirrande i början. Det finns några liknande användbara saker som du kan göra med dessa anonyma funktioner. Är det någon som har några frågor om detta, eller är det OK att bara, för nu, slags bara acceptera att det kommer att göra samma sak? Japp? PUBLIK: Är fungerar först klass i JavaScript? KEVIN SCHMID: De är först klass i JavaScript. Och bara veta att dessa begrepp passerar i en anonym funktion som detta gäller för JavaScript som du kan skriva in ditt slutprojekt för webbläsaren också. Så till exempel i JavaScript din webbläsare, det är också något evenemang drivs i den meningen att det som du kommer har är när användaren klickar på den här knapp, jag vill att du kör den här koden. Så det är samma typ av idéer av klientsidan när ett musklick eller de musen över en bild på din webbsida, kör den här koden. Det kan gälla för servrar. Så det är ungefär som det spännande anledning till att Javascript är ett riktigt lämpliga eller en del människor tycker att det är en lämpligt språk för denna typ av händelse förare server för att du har dessa anonyma funktioner. Du har hela idén med denna asynkron kod. OK. Någon som har några frågor? OK. Så det var simple.js. Så låt oss titta på en mer eller ett par mer. Så det här är sleep.js. Så är någon bekant med C-funktionen sömn? Från kanske en av de tidigare föreläsningar eller något liknande? Så i princip kan du skicka in Jag tror att en antalet sekunder eller om du använder U sova ett antal millisekunder eller nanosekunder. Och i grund och botten programmet kommer bara sluta kör för denna tid. Rätt? Och så kommer det att vakna upp till slut och då det kommer bara fortsätta att köra programmet. Så här servern slags ger intrycket av att sova. Så märker att vi har samma res.writeHead 200 med rubriken som tidigare, men då vi kallar detta funktion kallad set timeout. Ställ timeout finns även i webbläsaren Google Chrome eller Safari eller något annat. Och i grund och botten vad det gör här är det att ta in en funktion. Kallelse, igen, det är en anonym funktion. Så det är ganska coolt att vi är med hjälp av en anonym funktion inom en anonym funktion som kan vara lite konstigt. Men det tar den funktionen, vilket är princip säger - och hur detta verk är 5.000 millisekunder, jag vill ha dig att utföra den funktion som bara slutar svaret och skriver hej. Så detta ger intryck av liknande sova, men hur detta faktiskt fungerar är att vi ska gå igenom denna linje mycket snabbt. Vi ska bara skriva något. Och sedan kommer vi också gå igenom denna linje mycket snabbt. Så vi inte faktiskt går att vänta i fem sekunder. Vi kommer bara att köra denna kod direkt. Och så är det, återigen, den här lilla händelse slinga som nu har denna sak register som i grunden är just ständigt går runt i en cirkel och titta på klockan i en enda tråd och säger, har fem sekunder passerade än? Och sedan när den ser att den andra sidan har flyttat ut fem sekunder eller vad som helst, då den vaknar upp och säger: åh, vad ska jag göra? Åh jag måste köra den här koden. Och då det kommer att köra res.end hej. Så återigen, vi aldrig väntat här. Så det är inte att den här koden inuti denna funktion kommer att ta fem sekunder att köra. Denna kod kommer att köras ganska mycket ögonblickligen, åtminstone i förhållande till de fem sekunder som vi talade om tidigare innan. Så bara för att visa detta i handling, Jag kan göra Node.sleep.js. Och gjorde jag röra upp något? Möjligen. Ursäkta. Låt oss se vad vi kan göra för att fixa detta. OK. Så definitivt använda Node.js. Jag skojar bara. OK. Bara en sekund. OK. Jag vet vad det är. Så problemet är att i min andra fliken här, jag kör Node redan på att samma adress 1337. Så fel att det kastade, om vi ser på det verkliga noga, är adressen i använda, EADDRINUSE. Så jag använde redan 1337 här. Så om jag stänger detta av, och då jag nu försöker köra detta, förhoppningsvis, allt kommer att bli bra. OK. Så du kan bara ha en sak sorterar att lyssna på en port på en gång. En annan lösning skulle ha varit för mig att bara redigera det programmet och göra det bli som 1338 eller något så. Men nu sömn är igång. Så låt oss faktiskt prova det i browser denna gång eftersom det är en liten mekanismer för att se den i en terminal. Så jag ska bara gå till det 127 adress igen vid 1337. Och om du kan se det - Jag vet inte om du kan - men min läsares tar en mycket, mycket lång tid att ladda eller liknande fem sekunder. Och sedan efter det, det äntligen avslutades reaktionen. Och du kan inte se det eftersom saken flyttas över lite, men om jag gör detta lite mindre, du kan se den säger hej. Så jag fick hej, men efter fem sekunder. Och det kan vara lite renare att se det här på terminalen, så jag är kommer att göra en - låt oss göra här - låt oss göra Curl den adressen återigen med 1337. Och jag bara typ av sitta här i fem sekunder. Men märker att servern kan acceptera nya svar. Så det skriver hej. Och att demo detta, i princip vad Jag kan göra i denna andra flik - så låt oss säga att jag gör det i en annan flik, Jag ska göra Curl och samma sak igen. Och jag ska försöka sparka dessa ni av vid samma tidpunkt. Så jag ska göra det här, och jag är kommer att tävla över här och jag är kommer att göra det igen. Och låt oss göra det så att du kan se dem båda. Att man tryckt hej och att man tryckt hej hela vägen på - låt oss göra det experimentet igen. Faktiskt, låt oss använda detta trick, om det är OK. Så jag kommer att använda ett skal sak som gör att jag kan i princip köra två kopior av detta program parallellt. Så det ska köra det första programmet och det andra programmet parallellt. Så nu om jag trycker på Enter, det kommer att göra denna begäran ganska mycket momentant samtidigt. Så låt oss ge det ett skott. Så nu märker det står två processer. Och om du är nyfiken, att 27.000 nummer är i grunden den process-ID. Och sedan märker, de utskrivna hej samtidigt. Det var inte som vi fick vänta fem sekunder för en och sedan efter det, fem sekunder senare få den andra. Så det är ganska, på vissa sätt, det är inte riktigt bevis, men det är intuitiva bevis för att det är inte bara som att vänta fem sekunder och blockering hela tråden. OK coolt. Så Aron ställde en fråga tidigare att var väl det som om vi gör något - Japp? PUBLIK: Vänta. Hur är det annorlunda printf buffert, men? Är det inte automatiskt göra det? Varför vi behöver oroa dig för det? KEVIN Schmid: Åh, kunde du säga att en gång till? PUBLIK: inte gillar printf buffert gör exakt samma sak? KEVIN Schmid: Den printf buffert? PUBLIK: Ja. OK. Inte var i ett av de frågesporter de var talar om hur om du just printf något och sedan har det paus en andra, och sedan har du den slinga tio gånger, det ska vänta tio sekunder och sedan printf allt tillsammans? KEVIN Schmid: Åh, OK. PUBLIK: Är det att göra samma sak sedan i det här fallet? KEVIN Schmid: Så frågan var i grund och botten på en av de tidigare frågesporter eller något, det var en fråga som i grund och botten om du säger utskrifts f 10 saker på en gång och sedan sov som i processen med att skriva dem ut, vid slutet av någon anledning, skulle det bara dumpa dem alla ut på skärmen. Så det är ungefär två olika begrepp här. Så jag antar att en sak är att det i detta fallet är vi att göra med två olika slags människor frågar servern efter saker på samma gång. Och på grund av att den printf slags väntar så där och dumpar ut allt på en gång är mer relaterade till hur printf slags - så långt printf är faktiskt genomförts är det i grund och botten måste prata till operativsystemet att skriva i det där till konsolen. Så det inte vill göra allt detta grejer direkt när du säger printf snöre eftersom det kunde bli dyrt om det måste göra det varje gång. Så om du gör printf hey, ditt program kanske faktiskt inte ut att omedelbart till konsolen. Man skulle kunna säga, OK, jag skrev det. Och sedan slags vänta på dig att ge det lite mer innan faktiskt skriva ut till konsolen. Så anledningen till att så var fallet - och det är ganska orelaterade till sömn - är att sömn var liksom bara injicerades in där för att demonstrera Faktum är att den inte skriver det synkront. Men anledningen till det är just prestanda så att du inte behöver gör att många kontakter till det operativsystemet. Men här, det vi verkligen försöker göra med denna sömn sak är bara show att när vi har två personer som besöker denna webbplats, det kommer inte att sätta dem i en linje där det kommer att säga Jag måste hjälpa dig, och sedan när jag är helt klar med att hjälpa dig efter dessa fem sekunder, sedan kommer jag att gå vidare till nästa person. Så den första personens begäran inte binda upp den händelsen loop om det är vettigt. Men här är faktiskt ett exempel av något som kommer att knyta upp händelsen slingan. Så här är en hemsk funktion beräkna den n: te Fibonacci. Det är bokstavligen värre sätt du kan beräkna den n: te Fibonacci nummer. Och det är faktiskt bara att erkänna var detta kom från, det finns faktiskt - Jag menar, kan du försöka att gå och hitta det - men det är som en väldigt lång blogg posta att någon skrev. Det är som en av dessa Reddit saker. Men någon kritik Node.js, och de använde detta som ett exempel. Så jag liksom ville bara visa er två olika perspektiv bara för att få en allmän förståelse av begreppen bakom dessa två saker. Men detta väljs som bara en hemsk, fruktansvärt ineffektivt beräkningsmässigt intensiva sätt att beräkna n: te Fibonacci nummer. Så precis som en sidoanteckning, varför är det hemskt ut på ett sätt? Japp? PUBLIK: Säg att du startar ut med 1000. 1000 delas i 999 och 998. Var och en av detta delar sig i två saker. Var och en av detta delar sig i två saker. KEVIN Schmid: Höger. PUBLIK: Hela vägen ner. KEVIN Schmid: Exakt. Så bara för att upprepa för kameran, om jag ringa FIB på som 1000 eller något så där, det är uppenbarligen inte mindre än eller lika med ett så jag ska gå till denna annat fall, och då ska jag ringa FIB 999 plus FIB 998. Och så ganska mycket alla som arbete som FIB 999 gör är typ av på denna nivå. Om du går ner, är det ännu mer överflödiga än så, men om du bara tror computing fib 998 blir oss ganska nära fib 999. Så vi borde verkligen vara lite mer smart om hur vi slags åter dessa, men vi inte återanvända dessa saker alls. Så ni kan föreställa er detta gigantiska, gigantiskt träd som är bara hemskt. Men hur som helst, OK. Så det var fib. Det tar bara ett tag att köra. Japp? PUBLIK: [OHÖRBAR]. KEVIN Schmid: Åh, kunde du upprepa frågan? PUBLIK: [OHÖRBAR]. KEVIN SCHMID: Åh, så det är bara kod det kommer att vara typ av på serversidan. Så det här kommer inte att finnas i webbläsaren eller något. Det är i grund och botten vad vi har är att när användaren här ganska mycket märken deras begäran igen, när vi liksom göra en förfrågan, vi kommer att kalla denna funktion på serversidan. Och då får vi resultatet tillbaka från att kalla denna funktion. Och sedan kommer vi bara skriva ut det till användaren. Så användaren egentligen inte behandlar med denna funktion för mycket. Var det frågan? Låter det vettigt? OK. Cool. Så återigen, gör vi hela denna res.writeHead sak där vi skriver ut rubriken. Och så avslutar jag svaret genom att göra det magiska numret är fib 45. Så låt oss bara köra den här servern. Så jag ska göra en Nod fib.js. Så nu min fib-servern är igång. Och så här kommer jag att göra en av dessa. OK? Så jag ska bara säga, Curl. Så det kommer att ta ett tag, men förhoppningsvis snart kommer att avslutas och det kommer att skriva ut den 45: e Fibonacci nummer. PUBLIK: [OHÖRBAR]. KEVIN SCHMID: Det bör få gjort ganska snart. Så det bör ta 5-6 sekunder. Jag vet inte det är bara V8 är super snabb, men i varje fall är detta ett mycket korta exempel och avsikt klumpiga av en icke-trivial beräkning. Så efter ett tag, det får det. Men nu, vad händer om jag gör det samma typ av experiment som innan där jag gör två ansökningar samtidigt? Så här kommer jag att en Curl på den adressen, och jag ska att göra en annan Curl. Och kom ihåg, när vi gjorde detta för sova server, när vi i princip hade det efter fem sekunder, de ganska mycket båda kom tillbaka rätt ungefär samtidigt. Så det var inte särskilt bunden. Men låt oss prova det nu. OK, så vi fick våra två processer. Kom ihåg att det är de process ID. Det kommer att bli lite tafatt medan vi stall. Så låt oss bara stanna här och vänta. Så en av dem skulle komma tillbaka efter liknande - OK, så man kom tillbaka. Men varför gjorde inte den andra man kommit tillbaka ännu? Japp? PUBLIK: Servern kan inte göra något medan den beräknar det stora antal. KEVIN Schmid: Höger. Så svaret var bara att servern verkligen inte kan göra något medan det beräkna det Fibonacci nummer. Så nu fick jag bara mina två saker tillbaka. Men jag antar att bara tänka på koden lite mer, hur det funkar och allt. Så denna funktion här är den kod som Jag har sagt det här servern för att köra när det tar emot ett nytt inkommande begäran. Så det är bara att köra igenom detta hela koden, och då det kommer att gå tillbaka till händelsen slingan och sedan fortsätta kolla efter nya händelser. Så i princip vad vi har händer är servern är lyssna efter nya saker. Den första personen frågar efter vad 45 är. Vi kör den här koden för att beräkna den. Denna kod tar ungefär fem till sex sekunder att köra. Sedan går vi tillbaka till händelsen slingan och söka efter nya förfrågningar. Så detta är ett exempel på hur, om du få saker som är så kallade compute bunden, eller använder mycket computational, inte makt, men som är beräkningsintensiva - Jag antar att en sak att säga om detta är att denna funktion gör helt, för det mesta, söt nyttigt arbete rätt. Hela tiden att det återuppringning Funktionen kördes, det var ganska mycket spenderar större delen av sin tid bara datoranvändning som n: te Fibonacci nummer. Men vi hade bara en tråd att ta itu med. I Apache-modellen, när två personer framställt begäran att få fib 45, vi skulle ha haft två olika trådar. Och sedan operativsystemets jobb skulle ha varit, eller användarnivå kod som hanterar de trådar, skulle har varit att skära upp det på CPU, eller ens om du hade flera processorer, distribuerar dem jämnt över processorer så att de var både mål ungefär samtidigt. Så bara för att visa hur vi kan sortera om - och detta är inte ett totalt perfekt lösning, men typ av hur vi kan gör en komma tillbaka hit och göra lite bättre. Så vad jag har här är ett program som heter Fib C. Och detta i grund och botten använder en annan av Nodes moduler som kallas Barn Process-modulen. Så jag har bland annat varit i toppen typ som att jag skulle göra ett halvt kilo inkluderar barn process.h eller något. Nu har jag tillgång till denna CP variabel som har alla mina funktionalitet. Så nu vad jag gör i detta svar handler är jag kör det här programmet dot slash fib 45. Så vad jag har gjort - och jag ska bara att kliva ur programmet för ett lite - har jag skrivit ett C-program som princip beräknar n: te Fibonacci nummer. Så här är bara ett program som jag skrivit i C som beräknar detta. Jag kan kompilera det, och jag kan köra det på kommandoraden. Och det kommer att beräkna 45: e Fibonacci nummer. Så märker det bara tar ungefär lika länge. Jag förmodligen kunde ha använt streck 03 till optimera det eller något liknande, men jag gjorde precis som vanliga kompilatorinställningar. Och det skriver ut. Men nu, vad ska jag liksom göra? Åh förlåt, fel fil. Så jag gör samma saker med rubriken som tidigare. Då gör jag det här cp.exec. Vad detta kommer att göra är att det är kommer att köra det här programmet. Men hur detta fungerar är att det kommer inte att vänta på det programmet till slut. Det står bara i princip exekvera programmet. Så i princip skriver detta i kommandotolken sorts. Och sedan, när du är klar med det, kör den här funktionen. Så nu vi sorts få detta helt återställd sak av som om vi inte väntar. Innebär den typen av vettigt? Japp? PUBLIK: [OHÖRBAR]? KEVIN SCHMID: Så detta kommer faktiskt öppna upp en ny process för att göra det. Så detta är faktiskt, på vissa sätt, ondska, inte super ont, men det är viktigt att säga att detta är typ av att gå tillbaka till, å ena sidan, Apache modell där vi gör trådar och processer för varje begäran eller processer för varje förfrågan. Så det här är typ av analog vad Apache gör. I vissa fall kommer det att bara använda en ny tråd, vilket är lite mer ljus vikt än en process, men Apache kunde hamna forking en ny process som är typ av vad vi gör här implicit genom att göra punkt snedstreck fib 45. Och då i så fall, vi slags ådra samma kostnader för processer. Så det här är bara en sak du kan göra. Men bara för att visa denna typ av löpning. Och detta prat är bara verkligen syftar till presentera denna typ av program som sätt att visa olika perspektiv på hur man designar servrar så. Så detta är igång, och sedan nu om jag gör här igen, fick jag två process ID. Låt oss bara prata om saker att påpeka. Så märker att de är stegvis. Det är coolt. Eftersom det var 27.122 innan. Men varsel nu, kom de tillbaka vid ungefär samma tidpunkt. Och nu, en bra fråga att ställa om varför var att ärendet är, vars jobb var det nu för sorts göra dessa saker slags spela rättvist med varje andra, dessa två fall av dot slash fib 45 som jag sprang eller att Nod ran? Vilka slags gör det rimligt att de båda få slags balanserad körning? PUBLIK: [OHÖRBAR]. KEVIN Schmid: Ja. Så i princip, när jag gör dot slash fib 45 eller nåt sånt, nu är det typ av upp till operativsystemet för att hantera runtime av dessa program. Och nu kan schemalägga dem på olika processorer eller det kan schemalägga dem. Det kan skiva upp den tid som man CPU blir det eller att de får för att köras på en processor. Så det är tanken bakom det. Är det vettigt att alla? Så nu Nod inte riktigt spelar en del i att dela upp dessa uppgifter. OK. Så det är nästan det för exempel. Jag ville bara visa en sak eftersom mycket av detta har hittills varit inte helt super praktiskt i vissa fall. Jag kan tänka mig att komma hem efter detta prata och något och säga liknande, väl Jag fick typ av ur denna diskussion som Jag kan göra en Fibonacci-server för mitt slutprojekt. Så här är bara typ av ytterligare ett exempel som förhoppningsvis kommer att bli - Kanske inte, men kanske - lite mer slags betydelse för slutprojekt och tänka framåt för sånt. Så detta är chat.js. Så det här är ungefär som en del prov serversidan kod som du kan använda för att upprätta en liten chatt-server som du kanske har sett på Facebook Chat eller något annat. Så jag säger inte att det är som Facebook Chatta, men det är typ av som en bra - kanske inte bra, men kanske bra - utgångspunkten för en pratstund server för din webbplats för ett slutprojekt. Så låt oss titta på vad den gör. Så vi får denna speciella sak i toppen, Var detta SIO lika kräver Socket.IO. Så detta är en annan sak att den inte faktiskt levereras med Nod men du kan installera den. Det är en Nod-modul. Så det är precis som en förlängning till Node. SocketIO är faktiskt riktigt typ av cool. Det är en abstraktion som i princip vad det gör är att det tillåter dig att har denna ström av kommunikation mellan en bana webbläsare och en webbserver. Så för det mesta så långt har vi haft dessa mycket snabb en sekund eller två andra meddelanden mellan en bana webbläsaren och webbservern. Så det är i princip gå till google.com, get grejer, skicka tillbaka, och sedan vi är klara. Vi kommer aldrig prata igen förrän användare skriver i något annat. Men vad Socket.IO och liknande typ av saker - och SocketIO är faktiskt en av de saker som är byggt på så WebSocket som är typ av tillgänglig som en del av HTML5 - som tillåter dig att ha denna fortlöpande dialog. Och detta är mycket användbart i en chattserver sånt eftersom det är ungefär som en fortlöpande dialog några sätt för om du chattar med någon, kan du nu skicka ett meddelande ner i röret, varefter Servern kan sända ett meddelande ned röret till den andra personen att du är chattar med. Och då kan du ha denna utbyta så. Så det är ungefär vad SocketIO är bra för. Anledningen till att SocketIO använder WebSockets som en sak är att i Förutom att bara vanliga gamla WebSockets, det gör också några knep för att i grunden göra den webbläsare kompatibel. Så webbläsare som Internet Explorer Tyvärr stöder inte WebSockets direkt ur lådan. Så den använder någon annan typ av coola snyggt saker med Adobe Flash för att möjliggöra dig att ha kors webbläsare stöd. Så det är verkligen användbart. Och faktiskt, jag vet att jag är typ av körs på tid här, men CS50 Diskutera, har du någonsin sett något liksom, jag vet inte, tom så och så är svara på detta inlägg eller något så där, den funktionen? Det är SocketIO. Så när någon börjar skriva i diskutera rutan för att göra ett svar eller något, gör vad är din webbläsare heter i SocketIO avger någon form av händelse som säger att någon är svara på detta inlägg. Då servern säger, OK, vad ska jag göra? Ja nu har jag att säga till de andra killarna som är på CS50 Diskutera ser på detta inlägg som någon har att svara. Så det är ungefär vad SocketIO är bra för, detta fortsatta slags ström av dialog. OK. Så vad jag har här - och vi är bara kommer att ignorera anslutningar arrayen för lite - det jag gör är att jag en annan lyssnar. Så det är bara det sätt på Socket.IO är säger låt oss lyssna på den här porten. Och så gör jag detta på anslutning. Så det är bara i princip Socket IO: s sätt att säga, när vi får en anslutning, jag vill ha dig för att köra den här koden. Och märker att istället för att ha rec och res gick in där jag har Socket. Och detta Socket idé är i grunden detta sak som du kan skriva till och läsa från den som finns i användarens meddelanden möjligen. Och de meddelanden som du vill skicka kan gå igenom det Socket. Låter det vettigt? Så det är det fortsatta sak. Så vad jag gör är att jag kallar Socket.emit. Och avger tar ganska mycket två argument. Det första argumentet är en sträng precis som representerar typen av sak du avger. Så för detta fall, jag har användning denna sträng nytt meddelande. Och det är bara i princip säger att typ av denna sak, vad jag är sändning, är ett nytt meddelande. Så du kan lyssna efter specifika typer som nytt meddelande eller vad genom att använda dot vidare. Så anslutning och användaren skickas dit, om man tittar på var vi kallar prick på, de är andra strängar som representerar typer av användarmeddelanden. Så det är i princip att du kan få den här emit en av dessa typer av meddelanden, och sedan göra något som svar på ett av dessa meddelandetyper Så jag avger denna nya budskap. Vi kommer att ignorera connections.push för en sekund. Men då säger jag, Socket.on användar skickats. Så nu är det är ungefär som när användare skickar ett meddelande till mig, jag vill ha att du kör den här koden. Och märker att det anonym funktion tar upp här heter uppgifter som i huvudsak går att ha användarens meddelande. Så nu ska vi typ prat om anslutningarna arrayen. Så det här är avsedd för en chattklient där i stort sett alla är typ av i samma chattrum. Så i princip, vad vi behöver för att hålla runt är några array som i grund och botten representerar alla de människor som chattar i vissa sätt, om det är vettigt. Rätt? Eftersom vi behöver veta vem dessa killar är så att vi kan skicka meddelanden att andra människor skickar till oss. Vad denna kod gör är när användaren skickar ett meddelande - det är den typ av händelsen - vi kommer att köra den här koden. Och det vi gör är att vi kör igenom detta array som vi har kallat anslutningar. Och ganska mycket för varje anslutning utom den som är vårt, det är vad denna kod säger, vi skickar en ny budskap med det bifogade meddelandet information. Så om du märker här, vad jag gjorde när användaren faktiskt gör en ny anslutning Jag har lagt till JavaScript.push metod är detta i princip bara att säga som till att Socket som ett värde i våra kontakter array. Så nu när den här koden körs, kommer det skicka saker till de särskilda anslutningar. Så det här kan vara en bra utgångspunkt för framställning av en chattserver eller något liknande. Och den typ av häftiga är att den kod som du ser här ut på och avge och sånt är samma typ av JavaScript-kod som du skulle skriva i webbläsaren för att interagera med servern. Så det är därför SocketIO är typ av snyggt och användbar på detta sätt. Oh och bara en sak riktigt snabbt. Det fanns en CS50 slutprojekt förra året som i princip genomfört en chatt server i Node.js. Jag tycker det är Harvardchats.org men jag är inte - OK. Jag är inte säker på vad webbadressen är, men Jag kan skicka ut det efteråt. Men det är ganska coolt vad du kan göra med Node.js. Så jag hoppas att, i allmänhet, ni har en bra känsla för vad Node.js är användbart för och hur du kan kanske gälla till din slutprojekt. Jag kommer att skicka ut lite mer resurser tillsammans med detta. Och tack för att ni kom. Tack. [Applåder]