>> KEVIN SCHMID：大家好。
歡迎來到CS50研討會 關於Node.js的
我的名字是凱文。
我是一個CS50 TF。
和我有點像真的很興奮 關於本次研討會。
我覺得Node.js的是非常酷的。
我希望，這次研討會可以使用 作為一個好，我猜，跳板
一些最終的項目如果 你有興趣使用
像Node.js的
>> 排序我們將通過啟動研討會關閉 剛才談到的一點點
樣的背景可擴展性 Node.js的的觀點，然後
我們將移動到一些代碼示例。
而且我還會在網站上的代碼， 你可以看一下代碼。
並在研討會後，我會整理的通話 有關如何設置的Node.js
您的計算機上。
>> 確定。
所以，讓我們開始吧。
所以，我想我只是想談談 Web服務器，真的，第一次。
並開始討論，我 基本上有一個圖，它是從
用於CS61的教科書，這 基本上顯示了交互
一個客戶端程序，就像你的網頁之間 瀏覽器或像你的目標客戶端或
類似的東西，和Web服務器。
所以這種看起來類似 您在講座上看到的圖片
週三在那裡基本上我們有一些 客戶端程序，如谷歌Chrome瀏覽器。
>> 然後一步一個是 客戶端發送一個請求。
這樣就可以是這樣的好，讓我們 參觀，我不知道，CS50.net。
因此，我們發出了請求。
並沒有任何人記得名字 的協議，規定怎麼說
請求應該被構成的？
沒錯。
>> 觀眾：[聽不清]。
>> 凱文·施密德：沒錯。
所以它就像HTTP的，對不對？
所以基本上在如何規範 這一要求實際上應該被解僱
出來，因為在一天結束時， 該請求是真的只是喜歡
字符串，它基本上 說我想要這個。
和本說明書 因為這是HTTP。
所以這就像一個協議。
>> 那麼接下來的服務器接收 該請求。
所以，你們有安裝一個Web服務器 在CS50設備。
這是Apache的。
而本週，當你的工作問題 設置7，你實際上是工作
與該Web服務器。
因此，服務器接收到請求， 那麼它有一種劃傷其
頭，說喜歡什麼好 我該怎麼做？
>> 那麼基於它決定這樣做，那麼 它可能有聯繫的某種
的資源。
以及該資源可以是一個 很多不同的事情。
首先，它可能只是 就像一個靜態的HTML文件。
所以它可能只是像一些 HTML是一樣的
您的個人網站。
它可能是一個靜態文件等的圖像 或者像電影，你有。
它甚至可能不得不談 以某種數據庫
就像一個MySQL數據庫。
因此它並不總是具有通信 用的資源，但在
某些情況下，它可以。
>> 所以那麼它要做的事情 之後就是它要
發送回響應。
與此響應為 還通過HTTP指定。
這樣的話，客戶端可以接收它。
它可以把它拆開，並對其進行處理。
然後你會得到一個網頁 像谷歌或CS50.net或
不管你去。
好不好？
>> 因此，這是基本的互動， 我們將要處理的。
而且我們幾乎將是 專注於這部分的
相互作用，該服務器。
確定。
涼爽。
任何人有任何疑問這麼遠嗎？
確定。
>> 所以，當我們說，Web服務器接收 這個HTTP請求，然後發出這
HTTP響應。
而像我們談到前， CS50家電網絡服務器是Apache。
所以，當你們的工作P上設置7， 你將要與工作
Apache Web服務器。
你將永遠不會有真正的工作 與Apache直接太多。
那種你配置Apache一點點 當你指定虛擬主機或
在V主機，我們會得到 要在一點點。
>> 但基本上，Apache Web服務器 建立用PHP樣的工作
的開箱即用。
所以當你去什麼實際的情況是 您的網站公司，比如之一，
本地主機斜線的index.php什麼​​的， 是您的瀏覽器發送一個
請求，然後Apache是​​坐 那裡，計算出用它做。
和行動是執行 在index.php文件中的代碼和
然後發送回其關閉。
因此，有一點。
所以我們有點談過這個。
所以它可能只是成為一個靜態文件 或者運行一些PHP代碼，然後問題
的響應。
>> 這樣的話，可以來一個常見的問題 起來是好，我們怎麼真正處理
具有多用戶 在同一時間？
所以，如果你正在寫一個web想像 服務器，如果你有一個Web服務器，
您試圖在寫東西 像C或類似的東西，
基本上你可以想想如何有 可能是某種形式的代碼，
將接收請求，但隨後 它必須做所有這些工作就可以了。
它可以具有，例如，直接從 數據庫或類似的東西。
對不對？
然後它會做那種 處理，然後
發回的響應。
這就是像高 概述。
>> 但它不會立即明顯你如何 能做到這一點，讓兩個人或
甚至1000人可以與你的 Web服務器在同一時間。
讓Apache使用的解決方案 被稱為線程或進程。
所以，你可能聽說過 這些條款之前。
這是確定的，如果你還沒有，但只是覺得 關於線程或進程的途徑
操作系統或用戶程序或 類似的東西或Web服務器
排序執行多個 件事情。
所以，你可能已經聽說過這個詞 像執行的線程。
所以它有點像你 排序多任務。
>> 如果你看過上的框中輸入您的 筆記本電腦，或者類似的東西，
多核，你可以做的是，你可以 運行在不同的兩個不同的線程
CPU的部分，以便它們可以 實際上發生在同一時間。
所以這真的很強大。
這是一種Apache的中 解決這個問題的。
>> 那麼，有沒有一種像任何問題 這種方法雖然？
所以我想那種我寫了他們那裡。
但他們都有點 使用大量的內存。
這是非常昂貴的創建 一個線程或進程。
>> 和推理的部分是，僅僅 就像當你正在運行一個C程序
喜歡你的主，那麼該呼叫 另一個函數，有
某種堆棧。
因此，線程也需要一個完全 獨立的堆棧，
可能相當大。
如果你能想像有萬噸 在您的網站的用戶，你將有
有很多不同的線程。
這是一個很大棧來 管理和維護。
所以它的內存消耗大戶。
>> 然後，也，讓我們說你只有 一個CPU，還是讓我們說你有
比你有更多的線程 這些多核。
對不對？
因此，讓我們說你有10個線程 而你只有5個CPU。
有種你必須做這件事情的地方 您當前的之間切換
一個是因為你運行 不能運行所有10一次。
這就是所謂的上下文切換。
和這個詞實際上有幾個 不同的上下文，但我們只
把它當做交換 兩個線程之間。
這可以是相當昂貴的，因為 基本上你需要做的就是你
要停止你正在做什麼，救 即正在運行的線程的狀態，
然後切換到別的地方去。
>> 那種所以沒有大家看到的 為什麼線程和動機
過程可能會有點笨重？
和你有問題嗎？
確定。
涼爽。
任何人有任何問題嗎？
確定。
>> 因此，如果我們退後一步一秒鐘， 有一種像一個
觀察，我們可以對 大量的Web應用程序。
那真的是他們中的很多 其實不這樣做多少有用的
一個線程裡面工作。
因此，有沒有人在開始 p將7呢？
所以，你想也許描述 一些零件？
你處理過登錄 或者類似的東西？
>> 觀眾：號
>> KEVIN SCHMID：確定。
沒關係。
抱歉。
但基本上，在P組，你 要掙很多樣的
查詢數據庫得到一些 從該數據庫中的信息。
和你的代碼將被執行， 什麼是Apache進程或
Apache的線程將要幹什麼 同時它具有與該
數據庫是那種它的將是 坐在那裡，這將是
等待數據庫答辯。
>> 現在，聽起來並不像一個大 處理，因為數據庫是你的
CS50家電，對不對？
但有一些類型的網絡 等待時間也因為現在的網絡
服務器必須發出自己的請求 數據庫與溝通
數據庫，然後得到 信息反饋。
所以，現在它就像好等我，我 打算去得到的東西從
數據庫，然後有一個 很多等待事情。
這是否有道理？
>> 而對於一些東西，它不是那麼糟糕。
如果它僅僅具有例如 存取存儲器，即不喜歡
可怕的I / O延遲。
當我說，I / O延遲，就是我 指的是像任何一種像
輸入輸出。
但訪問磁盤上的文件，如 如果我想服務於靜態HTML
文件，該文件是在我的網頁或 這樣的事情，我種得
停止位，讀取該文件 在從磁盤，然後在
這個過程中我在等待。
我不是在做無用功。
>> 這是不是一切的事實，但它 常見於像寶潔這樣一套應用程序
七個很多的應用 你不是
實際上做了很多的思考。
當我說的思想，我的意思是 像計算工作。
所以計算工作可能會是 像，比如說，你想
編寫一個能夠計算一個Web服務器 第n個Fibonacci數。
這聽起來並不像一個特別 有趣的Web服務器。
就像我不希望該網站是 下一個Facebook，但這是一些
樣的計算工作。
>> 你能想像更換與 一些其他類型的有趣的
計算工作。
比方說，你寫的東西 該計算出的度
兩個人之間的分離 或者類似的東西。
所以，這的確涉及某種 計算的，對不對？
即使如此，要做到這一點你仍然有 做了很多的等待也許
你必須查詢數據庫看看 了誰是朋友誰或
類似的東西。
因此，有那種概念 的計算工作。
這是否有道理？
沒有任何人有任何問題嗎？
>> 哦，我想我把聊天服務器有 因為聊天服務器是一種
這另一個很好的例子。
一個聊天服務器不具備 做太多的思考。
它只是要等待的人 發送消息，然後當
他們，送他們。
好不好？
>> 因此，只是為了再次回顧一下，Apache和 像叉子類似的Web服務器
大量的線程和進程的這 可以是種浪費。
所以我想這可能出現的問題 從正在做我們需要有
多線程和進程？
如果我們只是有一個？
>> 因此，讓我們種的畫畫 什麼這會是什麼樣子。
因此，讓我們只使用一個線程。
好不好？
所以，想像一下這一個線程。
>> 讓我們假設我們並沒有真正做 那麼多有用的 - 當我說
有用的，我的意思是計算工作 -
在之前的多個線程。
因此，讓我們種的鞏固 一切都在一個線程。
那麼，如果我們有一個線程的那種 只是繞著中環和
不斷檢查，做了一件 新的情況發生。
因此，例如，新的東西發生了 可能意味著我得到的東西從後面
數據庫，或有人送 我一個新的HTTP請求。
因此，這些都是這類事件 這種情況發生，對不對？
>> 然後我能做些什麼時，這些新 事情發生在這同一個線程
執行的，這個單線程 執行，我可以調用一些代碼，
將處理特定的事情。
因此，舉例來說，如果我得到的東西回來 從數據庫，我可以運行我
它小的計算部分的 實際上只是準備的事情
發回給用戶。
因此，沒有那種有意義嗎？
>> 但什麼是真正的 這意味著什麼呢？
對不對？
因為我們已經寫了 大量的代碼 -
我只是要跳躍前進 在幻燈片中，如果這是確定。
所以，如果你不介意，我只是 要退一步。
所以這種事情是 稱為一個事件循環。
好不好？
而且它是一種基本的 背後Node.js的想法
>> 那麼，什麼Node.js的是真正做一個網站 服務器是有一個單獨的線程
這基本上是繞來繞去在一個循環 像一陣一種下
Node.js的引擎蓋那不斷 檢查，我們沒有收到新的東西？
然後它會運行處理程序 您設置。
但是一個很好的問題要問的是， 我們如何才能做到這一點
與現有的東西？
>> 所以我把行C代碼在這裡， 基本上看起來像它的打開
文件，對不對？
我她剛出來的時候帶一張專輯。
因此，我不得不打開她的一個新的文件。
所以，我們的方式操作的C代碼 -
我猜我選擇文件的原因是 因為這是一種程度
我們已經用C在完成I / O的工作 從某種意義上說，有輸入輸出。
所以我們稱這個代碼 這是否f開。
然後在我們的下一行 程序，我們現在可以與f工作。
>> 因此，這將是東西的例子 這就像同步或
在那第一線阻斷，因為 有我們在等待，直到我們
得到的文件打開。
因此，在第二行，我們知道，我們 可以與f工作，但是這意味著
那第二行不能真正運行 直到第一行被完成。
這是否有道理？
>> 因此，這將是壞把 在事件處理程序。
和用於該原因是 這種等待，對嗎？
因此，這將恢復我們回 同樣的事情。
現在我們甚至不會有 多線程的利益或
進程，因為我們得到了 在Node.js的一個線程
這是否是有意義的人呢？
>> 觀眾：請等待。
那麼，有什麼替代？
>> KEVIN SCHMID：哦，所以是的。
所以我打算去 更換。
確定。
那麼，如果我們有一些東西 這看起來是這樣？
那麼，如果現在我編輯的 F打開一點點？
所以我通過在同一個 兩個參數和以前一樣。
我仍然愛新曲 她想出了。
但我傳遞的第三件事， 在這個變量調用的代碼。
>> 但是，什麼是真正的代碼 在此上下文中？
是不是像一個普通的C變量？
這是一個函數，對不對？
而這可能是一個有點古怪，因為 我其實像現在傳遞
函數到另一個函數。
>> 所以，有兩件事情需要注意這一點。
一，我沒有實際調用 對碼功能。
所以，你不看代碼的 左括號，右括號。
我只是路過的代碼。
而在C中，這是什麼實際上會做 是給我一個指針，它指向的實際
代碼，那麼這可能會運行它。
但只是想想而已，你是 通過代碼運行時
該文件被打開。
>> 但是，這是什麼意思是，現在的 其餘的我的程序中哪些可以做
其他的東西，可以繼續做其他的 東西，而我們，沒有真正等待，但
只是在我們頭上的那回 當該文件的打開，運行
在上面的代碼。
這是否有道理？
>> 現在Node.js的背後的想法是， 在做的東西與f的代碼
部分應該是很短，簡單 而直接的，而不是真的
非常密集的計算。
它可能需要打開另一個文件，但 這也應該是相當快
因為它應該只是說做一套f 打開，然後調用該其他代碼。
>> 因此，只要是完全清楚，在F 打開，做了新的Katy Perry的歌
做過MP3，那將相當 多立即返回。
然後我們就可以繼續做 其他的東西，因為所有的，現在f
公開徵集沒有被告知基本 底層F打開代碼打開這個文件
而當你完成打開此 文件或當你把它找回來，
然後運行該代碼。
但它實際上並沒有執行該代碼。
和你有一個問題嗎？
>> 觀眾：你似乎暗示了幾個 ，添加計算時代
排序密集型代碼破解 [聽不清]驅動系統。
[聽不清]？
>> KEVIN SCHMID：這是一個很大的問題。
所以，我其實有多麼的例子 你可以計算整合
在一點點密集型代碼。
所以，當我們到達的代碼示例， 我一定會拉那一個。
這樣可以嗎？
謝謝。
>> 你叫什麼名字？
>> 觀眾：亞倫。
>> KEVIN SCHMID：亞倫帶來了一個非常 好點的，那就是如果我有
在某些計算密集型代碼 與f的一部分，其餘的做的東西
我的程序不能運行，不能聽 新的請求或任何東西，直到所有
這些東西完成。
所以，如果我寫代碼的節點一般 除非我們做一些像我要去
後來建議，當我們看 代碼示例，我必須確保
我的代碼不會佔用 此事件循環。
這是否有道理？
確定。
涼爽。
>> 所以Node.js的提供了這種框架， 驅動你可以建立這些事件
服務器用。
所以它有這類異步 非阻塞I / O庫，而
我們已經得到了標準C函數庫 用，工作一樣，如果你​​只是
使用他們，因為我們已經以同樣的方式 一直在使用他們與f打開，
的東西，那些被封鎖，因為 你居然要等
該文件將其打開。
>> 但Node.js的給你，和它 基本上是關係到谷歌的V8
JavaScript引擎，這是什麼原因 認為Chrome是在處理如此之快
JavaScript的，因為它 有這樣的V8發動機。
所以我知道這聽起來像一個 WWDC開發者大會的事情
在那裡，他們只是扔了一堆的 信號東西處理器
並說這是太酷了。
但它很酷，他們沒有 這是因為JavaScript的 -
也許，如果你不熟悉 JavaScript尚未因為我們還沒有
其上的演講 -
但是JavaScript是一種解釋性 語言。
>> 這是一個重要的點了。
所以這是我們的重要 服務器要快，對不對？
如果我們只是運行的JavaScript 這被解釋與代碼只是
任何舊的解釋器可能會很慢。
從有這個所以節點的好處 超快速的V8翻譯。
我不知道他們把它命名為 因為在額頭上的V8引擎耳光
的事情，但確定。
>> 所以，我準備了一些例子 在此URL。
會後，我有點要 談談你如何能得到的節點集
了，但現在，我只是有點想 步行通過一些代碼示例。
所以，如果你想跟著，所有的 源代碼可以在那裡。
好不好？
>> 所以我會離開這個網址 向上一點點。
然後，我只是要 切換到端子。
是大家用好這個網址？
所以，我要切換 在這裡我的終端。
>> 因此，這裡的代碼， 我有今天。
為什麼我們不開始 simpler.js文件？
另一件事是，所有這一切 代碼將要被寫在
JavaScript的，你可能會或 可能不熟悉。
我想有兩件事情是，很多 JavaScript代碼是什麼樣的
語法和結構是非常相似的 C，太客氣了，你可以把它撿起來作為
你走。
我試著寫了很多的 這在某種程度上是起始碼
類似於C，使得它的 多一點可讀。
但是，正如我們進步，我會 展示一些額外的
JavaScript的功能， 是挺酷的。
>> 但是讓我們看看這個示例程序。
我想一切都切斷了那裡。
我只是去解決，真正的 快，如果這是確定與否。
我不知道這是什麼要做。
那是好一點？
你可以看到var和東西？
確定。
>> 所以，第一行是像JavaScript的 版本的變量
聲明。
因此，只是為了突出這是什麼會 看起來像在C因此，這就像
我說指數等於三 或者類似的東西。
所以我沒有指定類型。
JavaScript的確實有類型的，但它的 非常的自然動態類型，所以
沒有提供它的任何一種類型的。
所以它只是變種。
這就像變量。
好不好？
>> 而且我調用這個變量的HTTP。
而在我的右手邊，我有 我希望把HTTP中的表達。
這表示需要HTTP。
因此，這是種類似於包含。
這是一個有點像強大的比 包括在包含感
將剛才複製並粘貼頭 文件中的函數原型或
無論與類型定義。
但要求其實已在進行 讓我們的代碼。
>> 所以，你可以把它看作 導入一些代碼。
因此，在某處Node.js的模塊中 系統或什麼，他們有這一切
HTTP服務器代碼，所以我只是 取它為我自己
個人使用此計劃。
好不好？
>> 於是我有這個功能 我寫。
並請注意，我沒有指定 返回類型或的類型
爭論了。
所以，那種鬆散的類型 那種感覺。
兩個參數，它需要的， 請求和響應。
所以這是概念上有點像 事實是，我們有熟悉的畫面
在屏幕上，因為前 我們得到這個要求，我們
有來自用戶。
然後我們有一個響應 我們可以寫的東西。
>> 所以這個第一行不 res.writeHead 200，然後該
內容類型文本平原。
因此，讓我們這一塊分開一點點。
所以讓我們只專注於res.write 一點點。
這樣寫是基本上和寫頭， 只是方式來排序的寫出來
活動的響應。
好不好？
所以寫頭，如果有人記得 從HTTP講座，做你們
記得頭在 的HTTP的東西上面？
那麼，為什麼不讓我演示 頭真正的快。
請問這是否有幫助嗎？
排序還是應該只是 -
確定。
當然可以。
>> 所以，當您的瀏覽器去google.com 或類似的東西，
那裡實際上是一個多一點 -
這就像一個秘密 -
有像一個小的更多信息 這是通過管道不僅僅是
小查和一切。
所以，向你展示這一點，我要去 使用一個名為捲曲的程序。
好不好？
因此，這是東西，你可以在運行 您的Mac OSX命令行或在
電器或什麼的。
所以，如果我不捲曲的HTTP google.com， 我要看到HTML。
這就是，在公平，公正的 HTML類型的，它告訴你
重定向到www如果您的瀏覽器不 自動處理
重定向。
>> 所以這只是HTML，但我要去 要添加到這個蜷縮連字符I標誌。
好不好？
這是要告訴 我的頭。
所以這也是自帶信息 通過當我得到這個答复。
好不好？
>> 所以在頂部，你看這 HTTP 301永久移動。
這是一種重要的，因為 這指的是狀態代碼。
因此，這裡的301狀態碼， 這基本上只是一個整數
，告訴瀏覽器或誰是 讀這篇文章，如果你假裝
你是一個瀏覽器，你看到這一點， 基本上現在如果你看一下
這一點，你看到一個301，你知道我有 做基於一些特別的東西
301，什麼特別的事發生 基於301。
所以說，永久移動。
>> 然後，基本上，我們也 一堆鍵值對。
所以我們得到的位置 是www.google.com。
然後那種所有這些其他的東西， 但基本上，位置是什麼
說是新的位置 是在www.google.com。
所以，現在如果你去到google.com，你會 排序看到瀏覽器那種閃爍的
一秒鐘，然後重定向 右後衛上www.google.com。
這樣的反應可以包含 這些頭文件。
>> 和幾件事情要指出。
所以我們說，我們實際上是成功的 在訪問一個網頁。
所以讓我去 -
什麼是一個好的網站？
我是壞的好思路 當場網站。
>> 觀眾：維基百科。
>> KEVIN SCHMID：確定。
讓我們做維基百科。
所以在這裡我很感動。
哦，等等。
是我？
是的，我是。
確定。
所以，我必須做的www。
所以我要做的www。
正如你可以看到，這裡的所有的HTML 該瀏覽器將處理
維基百科。
>> 但是，如果我繼續在這裡滾動起來， 我會看到在頂部 -
哇，有很多的 HTML在維基百科 -
但我可以在上面看到這裡 這200狀態碼，相對於
301，我在前面看到的。
並注意到它有一個很好的 友好確定它旁邊。
因此，這是像好狀態代碼。
>> 這是否200號眼熟？
是的，因為當我做simpler.js， 我寫了一個200那裡。
所以這基本上是說告訴 瀏覽器或任何人試圖去
這一點，他們是成功的。
或者說，有點像我們的 是成功了。
>> 還有的這種特殊的語法 在Javascript中用於聲明一個
映射這些鍵，如內容類型 而像純文本這些值。
所以，如果你看一下反應，我們 得到了來自維基百科回來之前， -
我要去嘗試滾動 起來快一點 -
你有這些按鍵像服務器 並且這些值的Apache。
所以，你有鍵和值。
而且你可以指定此 節點是什麼送回去。
>> 因此，這是一種實際上，在某些 方式，並在某些方面它不是
真的，但它是一個低一點的水平 比你可能會對PHP代碼
寫作對於P設置7，因為PHP和 排序阿帕奇採取一些護理
這些東西給你。
在PHP中，你可以覆蓋默認 行為通過編寫自己的頭。
但對於這個目的，我們得到 寫出自己的頭。
>> 那麼，這行是有意義的 大家好，寫磁頭線？
確定。
真棒。
>> 所以後來我做的是我最終的響應 說你好的世界。
確定。
但是這只是一個函數 被稱為請求處理程序。
所以，現在我居然有一種做 一些與這一功能，對不對？
>> 所以在這裡我要做的就是有這個 這確實變種服務器等號線
HTTP.create服務器，然後我 通過在請求處理程序。
因此，這是一種對節點 創建服務器的方式。
並注意到我傳遞 在請求處理程序。
因此，這是告訴createServer 函數，我要你為我做
服務器，並且當該服務器接收 一個回應，我需要你調用這個
請求處理函數。
好不好？
>> 因此，該行幾乎 結束的時候了。
因此，無功服務器產品線是做正確的 你這樣做之後漂亮多了。
我的意思是，它必須設置一些內部 狀態要知道，你將不得不
調用請求處理功能，但 它不會坐在那裡，
比如說有發送用戶 我還請求？
有用戶發過來的請求了嗎？
所以它不會阻止。
好不好？
>> 那麼，這帶給我們的是它基本上 現在存儲一個指向這段代碼，
申請的處理函數，然後 將運行該代碼，當有人
發出請求。
然後我們做server.listen。
>> 1337有相當隨意的。
我沒有特別的原因 用於拾取該號碼。
這是完全隨機的。
但是，這只是指定端口。
所以大多數Web服務器，你會看到他們 使用80端口，因為這是一種
像的慣例。
所以，如果我去喜歡的東西， 我不知道，Wikipedia.org，
我把結腸8 -
哇哦，你看不到這一點。
對不起。
但如果我這樣做維基百科 -
我會在這裡寫出來只是讓 很明顯在相機上。
但是，如果我拿這與一個瀏覽器 一個冒號80，指定去
Wikipedia.org在端口80。
所以它就像美國如何有 喜歡在那裡你可以出貨多個端口
事情來樣。
所以它就像去這個特殊的 放在該服務器上。
確定。
>> 所以，我只是選擇了1337。
有數字的整個範圍 你可以挑選。
這不是完全特殊。
>> 但我現在打算怎麼辦 是我要運行節點。
讓我真正進入，一對夫婦 台詞背下來了，這樣你可以看到它。
我要做節點，和我 要運行simpler.js。
我們將討論如何獲得 節點設置在一點點。
但現在它只是運行的服務器。
>> 因此，有一點我們可以嘗試這可能不 是，令人興奮的是，我們實際上可以
嘗試訪問它的捲曲。
所以我可以做捲髮，和我 機器是本地主機。
您還可以看到這樣寫 這樣有時。
本地主機和127.0.0.1是善良 像您的家用電腦。
所以它就像說話 您自己的電腦。
確定。
>> 然後我可以說1337。
所以，如果我運行這行代碼， 它說的hello world。
如果我想看到的東西， 有內容類型的文本或純
什麼，我什至可以把這個在這裡。
並注意到它說OK。
和我有文字平原。
再有就是那種所有這些其他 的東西，節點將加入
還有我。
這不是超級重要。
>> 我的意思是，有某種技術 在客氣的方面
爽談，但只是為了顯示 你，我也有權力
圍繞改變這些。
所以，我可以再補充了一堆 之類的東西。
然後現在，如果我看在我 輸出，它將是。
所以，這些頭的意思是某些事情 以瀏覽器之類的東西。
>> 和頭基本上可以告訴瀏覽器 如何應對一些東西。
如果你曾經聽說過的餅乾之前， 或者如果你曾經去過惱火
通過網頁設置cookie， 或開啟cookie的塊或
類似的東西。
實際上，你可以設置Cookie 在這些頭。
所以他們告訴瀏覽器如何 行為的情況。
確定。
>> 所以這是simpler.js。
沒有任何人有任何疑問， 該源代碼文件？
確定。
涼爽。
>> 因此，讓我們從除去R 看看simple.js。
所以這是相當多 相同的程序。
我剛寫的有點不同 因為我想排序亮點
JavaScript的某些功能。
>> 所以請注意，請求處理程序 功能已經完全消失了。
哦，是的，你有問題嗎？
>> 觀眾：是的，論據 傳遞給該
函數，它們是什麼？
>> KEVIN SCHMID：因此，這些都是 JavaScript對象。
在Node.js的文檔，它 基本上說用什麼方法都
適用於他們。
我們只是碰巧有訪問 這種方法被稱為寫開頭和結尾
和類似的東西。
但有一大堆 更多的方法。
>> 並舉例說，像他們中的一個 特別是在拍攝，你可以做
像rec.method這將 告訴你，無論它是一個HTTP GET或
HTTP POST請求和 這樣的事情。
因此，有各種不同的 屬性，但他們都
JavaScript對象，而他們只是有 重視他們的功能，你
可以寫的東西。
好不好？
>> 所以請注意，請求處理程序 是完全消失了。
但是，我不得不在請求的代碼 處理程序仍然存在。
我仍然有這個res.writeHead 我仍然有這個res.end。
和這個是什麼的一個例子 JavaScript是這個想法的
匿名函數。
和匿名就像是一個合適的名字 它，因為它字面上不
有一個名字。
有沒有功能要求 處理程序在裡面。
>> 沒有名字，但它仍然 是採取一種說法。
所以我還是得到了REC和水庫。
而且我仍然有代碼。
這是完全正常 JavaScript代碼。
因此，我可以聲明一個函數不 明確地給它起名字。
這是起初有點混亂。
還有一些像有用的東西 你可以用做
這些匿名函數。
沒有任何人對此有任何疑問， 或者是它確定只是，現在，
只是有點接受它 會做同樣的事情？
沒錯？
>> 觀眾：首先功能 在JavaScript類？
>> KEVIN SCHMID：他們是第一 類中的JavaScript。
而只知道這些概念 傳遞像一個匿名函數
這適用於JavaScript的你 可以寫在您的最終項目
Web瀏覽器也。
因此，例如，在JavaScript中 您的瀏覽器，它也有些事件
在這個意義上推動了什麼，你會 已經是當用戶點擊這個
按鈕，我希望你能運行此代碼。
>> 所以它的同類的想法 客戶端當用鼠標點擊或者
鼠標在一些圖像上的 網頁，運行此代碼。
這可以應用到服務器。
所以這是一種像令人興奮 之所以JavaScript是一個非常
適合或有些人認為這是一個 合適的語言為這種
事件驅動的服務器，因為你有 這些匿名函數。
你的整體思路 這個異步代碼。
確定。
任何人有任何問題嗎？
>> 確定。
所以這是simple.js。
因此，讓我們再看一個 或一對夫婦更多。
因此，這是sleep.js。
所以，是任何人都熟悉 C函數的睡眠？
從早期的講座可能是一 或者類似的東西？
>> 所以基本上你可以通過在我認為 秒數，或者如果你使用U形
睡了一毫秒數 或納秒。
和基本程序將停止 運行的時間量。
對不對？
然後它最終會醒來， 然後它會只是繼續運行
該方案。
>> 排序所以這台服務器提供 睡覺的印象。
所以請注意，我們有相同的 res.writeHead 200與作為頭
之前，但隨後我們調用這個 函數調用設置超時。
設置超時也可用於 您的Web瀏覽器谷歌瀏覽器
或Safari或什麼的。
基本上它在做什麼在這裡 是它採取的一個函數。
通知，再次，它是一個 匿名函數。
所以這是一種很酷的，因為我們是 使用中的匿名函數
匿名函數 可以是一個有點怪異。
>> 但它採取這一功能，這是 基本上說 - 而這方式
作品是在5,000毫秒，我想 您可以執行功能，
剛剛結束的響應，並寫入哎。
所以，這給像印象 睡覺，但這種方式實際上
工作原理是，我們將通過運行 這條線非常快。
我們只是寫東西。
然後，我們還可以通過運行 這條線非常快。
因此，我們沒有真正去 等待五秒鐘。
我們只是要運行 這段代碼瞬間。
>> 再有就是，同樣，這一點 事件循環，現在有這個東西
寄存器，基本上只是 不斷繞來繞去轉了一圈
並期待在一個單一的時鐘 螺紋和說法，有5秒
通過了嗎？
然後它看到時，所述第二 手已經搬到像五秒鐘
什麼，那麼它喚醒並說， 哦，我有什麼做的？
哦，我要運行此代碼。
然後它會 運行res.end哎。
>> 所以，再一次，我們永遠在這裡等待。
所以它不是說的這裡面的代碼 此功能是要取五
跑秒。
此代碼將運行幾乎 瞬間，至少相對於
5秒鐘，我們在談論 關於早期之前。
>> 所以，只是為了顯示這個動作， 我可以做Node.sleep.js。
和我做了亂七八糟的東西？
也許吧。
抱歉。
讓我們看看我們能做些什麼來解決這個問題。
確定。
所以，一定要使用Node.js的
我只是在開玩笑。
確定。
只要一秒鐘。
確定。
我知道它是什麼。
>> 所以，問題是，在我的其他選項卡 在這裡，我已經上運行的節點
該相同的地址，1337。
所以錯誤，這扔，如果我們看一下 它真正的緊密結合，是在地址
使用，EADDRINUSE。
所以，我已經使用1337這裡。
所以，如果我關這一關，然後我現在 試圖運行此，希望一切
將被罰款。
確定。
所以，你只能有一件事排序 的端口上監聽一次。
另一種解決方案已經為我 只是編輯程序，並
它是像1338或東西 這樣的。
>> 但現在睡眠運行。
因此，讓我們真正嘗試出來的 瀏覽器這個時間，因為它是一個
小平平無奇，看看 它在一個終端。
所以我只是去那 127地址又在1337。
如果你能看到它 -
我不知道你能不能 - 但我 瀏覽器採取了很長很長
時間來加載或類似的五秒鐘。
>> 然後在這之後，它終於 結束了回應。
而你看不到它，因為事情 移過一點，​​但如果我做
這個有點小，你 可以看到它說，哎。
所以我得到了哎，但 後五秒鐘。
它可能是一個小吸塵器看 在這裡在終端上，所以我
要做一個 -
讓我們做在這裡 -
讓我們做捲曲的地址 再次與1337。
我只是那種有坐 這裡五秒鐘。
但是請注意，該服務器 可以接受新的回應。
所以它打印哎。
>> 並演示這一點，基本上是什麼 我可以做這個的其他標籤 -
所以讓我們說我這樣做是在另一個選項卡， 我打算做捲曲和相同
事情再次。
我要去嘗試踢這些 關閉傢伙在同一時間。
所以，我要做到這一點，而且我 去比賽在這裡，我
要再做一次。
>> 讓我們做它，以便您 可以看到他們兩個。
這一個印刷哎並且一個 印哎一路在 -
讓我們做實驗了。
其實，讓我們用這個 欺騙，如果這是確定。
>> 所以我打算使用shell的事情， 讓我基本上跑兩個副本
這個程序並行的。
所以它會運行的第一個程序，並 並聯的第二程序。
所以，現在如果我按下Enter鍵，它會 作出這樣的要求幾乎
瞬時地在同一時間。
因此，讓我們給這個一桿。
>> 所以，現在發現它說兩個過程。
如果你很好奇，那27,000 數基本上是進程ID。
然後請注意，他們印製 哎在同一時間。
這不像我們不得不等待五 為1，然後經過該秒，
五秒鐘後獲得的第二個。
所以這樣的，在某些方面，它的 沒有真正的證據，但它的
直觀的證據表明，它不只是 喜歡等待五秒鐘，阻斷
整個主題。
好涼。
>> 因此，阿龍問了一個問題早些時候， 是，還有什麼，如果我們不做些什麼 -
沒錯？
>> 觀眾：請等待。
如何是，從不同的 printf的緩衝，但？
沒有它會自動做呢？
我們為什麼要擔心呢？
>> KEVIN SCHMID：哦，你可以 說一次嗎？
>> 觀眾：不喜歡printf的緩衝 做同樣的事情？
>> KEVIN SCHMID：在printf的緩衝？
>> 觀眾：是啊。
確定。
在他們的測驗之一是不 談到如何，如果你正確的printf
的東西，然後有它停頓1 第二個，然後你把它圈10
有時，它會等待十秒鐘， 然後printf的一切融合在一起？
>> KEVIN SCHMID：哦，好吧。
>> 觀眾：難道做同樣的 事情那麼在這種情況下？
>> KEVIN SCHMID：所以現在的問題是 基本上在前測驗之一
什麼的，有一個問題， 基本上，如果你說的打印F 10
在一個時間的事情，然後睡在像 這些打印出來的過程中，
在端由於某種原因，它會 只轉儲所有那些在屏幕上。
因此，有一種兩個不同的 概念在這裡。
>> 所以我想有一件事是，在這 情況下，我們正在處理兩個不同的
樣的人要求服務器 事情的同時。
而且該printf的那種原因 等待這樣的，它轉儲全力以赴
一次更多的是 printf的怎麼樣 -
所以printf的方式實際上是 實行的是它基本上有
聊到操作系統來寫 這些東西到控制台。
因此，它並不想這樣做了這一切 當你說printf的東西立刻
一些字符串，因為它可以 得到昂貴的，如果它有
做每一次。
>> 所以，如果你做的printf哎，你的程序 實際可能不打印
馬上到控制台。
它可能會說，好吧，我寫的。
然後那種等待你給 之前確實有點多
寫它輸出到控制台。
>> 所以這是這種情況的原因 -
它是種無關 到睡眠 -
是，睡眠是那種剛 注射在那裡展示
事實上，它並沒有寫 它同步。
但對於其原因僅僅是 性能，讓您不必
讓很多接觸， 該操作系統。
>> 但在這裡，我們真正要做的 這種睡眠事情就是秀
當我們有兩個人訪問 這個網站，它不會把
他們在一個行，其中它會說 我一定要幫你，然後當我
完全完成，幫助你以後這些 五秒鐘，然後我要去
移動到下一個人。
所以第一人的要求不 佔用的事件循環
如果是有道理的。
>> 但這裡實際上是一個例子 的東西，將配合
了事件循環。
所以這裡有一個可怕的功能 計算第n個斐波那契數。
這是字面上的糟糕方式，您可以 計算第n個Fibonacci數。
這其實只是承認 這哪裡是來自，
實際上，有 -
我的意思是，你可以嘗試去找到它 - 但 有沒有像一個非常漫長的博客
後有人寫道。
這就像那些書籤交易的事情之一。
但有人批評Node.js的，並 他們用這個作為一個例子。
樣的，所以我想只顯示兩個 不同的觀點只是為了得到
概念的一般理解 後面這兩個東西。
>> 但這個選擇只是一個可怕的， 可怕的低效計算
密集的方式來計算 第n個Fibonacci數。
因此，正如一個側面說明，為什麼 它像可怕的一種方式？
沒錯？
>> 觀眾：說你開始 用1,000。
1,000分裂成999和998。
每一個這樣分割成兩件事情。
>> 凱文·施密德：對。
>> 觀眾：一路下來。
>> 凱文·施密德：沒錯。
因此，只要重複的攝像頭，如果我 打電話撒謊像1,000或東西
這樣，它顯然不低於 或等於一所以我要去
去這個東西的情況下，然後我要去 打電話撒謊999加些小謊998。
然後幾乎所有的 FIB表999做的工作是
那種在這個水平。
如果你去了，它甚至更多的冗餘 比，但如果你只是
想計算FIB 998得到 我們非常接近，撒謊999。
所以，我們真的應該多一點 關於巧樣的，我們如何重複使用
這些，但我們不重用 這些東西都沒有。
所以你可以想像這個龐大的， 巨大的樹，這只是太可怕了。
>> 但無論如何，確定。
所以這是謊。
它只是需要一段時間來運行。
沒錯？
>> 觀眾：[聽不清]。
>> KEVIN SCHMID：哦，你可以 重複的問題？
>> 觀眾：[聽不清]。
>> KEVIN SCHMID：哦所以這只是代碼 這將是某種對
服務器端。
因此，這是不會被發現 在瀏覽器或任何東西。
這基本上是我們所擁有的是，當 這裡的用戶幾乎使
他們的要求再次，當某種我們 提出一個請求，我們將調用
此功能在服務器端。
然後我們會得到結果返回 從調用該函數。
然後我們將只打印 它給用戶。
所以用戶並沒有真正處理 使用此功能太多。
>> 是這個問題嗎？
這是否有道理？
確定。
涼爽。
>> 所以，再一次，我們做這整個res.writeHead 在這裡我們打印出來的東西
頭。
然後我做最終的反應 神奇的數字是FIB 45。
因此，讓我們只需運行該服務器。
所以我要做一個節點fib.js.
所以現在我的FIB服務器正在運行。
>> 然後在這裡，我要去 做其中之一。
好不好？
所以，我只是想說，捲曲。
因此，這將需要一些時間，但 希望很快就會完成，
它會打印出45次 斐波納契數。
>> 觀眾：[聽不清]。
>> KEVIN SCHMID：應該 得到很快完成。
所以應該採取5〜6秒。
我不知道，只是V8發動機被超 快，但在任何情況下，這是一個
很簡單的例子，並故意 不雅的不平凡
計算。
因此，一段時間後，它得到這一點。
>> 但現在，如果我做同一種 實驗和以前一樣，我做
在同一時間兩個請求？
所以在這裡我要對捲曲 該地址，我要去
另做捲曲。
請記住，當我們這樣做的 睡覺的服務器，當我們基本上有它
五秒鐘後，他們很 兩個多回來權利
大約在同一時間。
所以它不是特別綁起來。
>> 但是，讓我們現在就來試試。
好了，我們得到了我們的兩個過程。
還記得那些是進程ID。
這將是一個小 尷尬的同時，我們搪塞。
因此，讓我們住在這兒等待。
>> 所以，他們中的一個應該是 回來後像 -
好了，一個人回來。
但後​​來為什麼沒有第二 1回來，只是還沒有？
沒錯？
>> 觀眾：服務器不能做任何事情 而它的計算是大數目。
>> 凱文·施密德：對。
因此，反應只是服務器 真的不能做任何事情，而
它的計算是斐波那契數。
所以，現在我剛剛拿到我的兩個東西回來。
但我猜只是想想代碼 多一點，它是如何工作的
和一切。
>> 所以這個功能在這裡是代碼， 我已經告訴這台服務器，當它運行
接收到新的傳入請求。
所以它只是通過這個運行 整個代碼，然後它會去
回到事件循環，然後繼續 檢查是否有新的事件。
所以基本上我們所發生的事情 是服務器
聽新的東西。
第一個人問什麼45。
我們運行這個代碼來計算它。
此代碼需要大約五 六秒運行。
然後我們回到事件循環 並檢查是否有新的要求。
>> 所以這是一個如何一個例子，如果 有事情是所謂的計算
約束，或者使用大量的計算， 沒有權力，但有一樣
計算密集型 -
我想有一件事要說一下，這是 這個函數是做完全，
在大多數情況下，很 有用的工作權利。
整個時間的回調 功能正在運行，它是非常
多花大部分時間只是 計算的第n個斐波那契數。
>> 但我們只有一個線程 對付。
在Apache的模型中，當兩個人 就該好好撒謊45的要求，我們
將有兩個不同的線程。
然後操作系統的作業 本來，或者用戶級別
用於管理線程中的代碼，會一直 一直到切片，截至上
CPU的，甚至如果你有多個CPU， 均勻地分佈它們在整個CPU的
讓他們都完成 大約在同一時間。
>> 因此，只是為了告訴你如何可以排序的 - 這不是一個完美的總
排序的解決方案，但我們如何能 賺回來這裡做
好一點點。
那麼，我這裡是一個調用程序 FIB C.這基本上使用
的節點的模塊，另外一個叫 子進程模塊。
所以，我已經包括了在上面種 像我會做一斤包括
孩子PROCESS.H什麼的。
現在我有機會使用新的CP變量 裡面有我所有的功能。
>> 所以，現在我在做什麼在此回應 處理程序是我運行這個程序
點斜線FIB 45。
所以我做了什麼 - 我只是去 走出這一計劃的一個
點點 -
是我寫了一個C程序 基本計算
第n個Fibonacci數。
因此，這裡只是我寫了一個程序 C語言，計算這一點。
我可以編譯它，我可以運行 它在命令行中。
並且它要計算 第45斐波那契數。
>> 所以，注意它只是需要 相當多長。
我大概也可以使用破折號03 優化它或類似的東西，
但我就是不喜歡常規 編譯器設置。
而且它打印出來。
>> 但現在，我是什麼樣的做什麼？
哦，對不起，錯了文件。
所以我做同樣的東西用 如之前的標頭。
然後，我這樣做cp.exec。
那麼，這是怎麼回事做的是它的 要運行此程序。
但這種工作方式是， 它不會等待
該程序來完成。
它只是基本上說 執行此程序。
所以基本上鍵入此進 命令提示符樣的。
>> 然後，當你與完成 它，運行此功能。
那種所以現在我們得到這個 整個恢復的事情
就像我們不能等待。
這是否一種有意義嗎？
沒錯？
>> 觀眾：[聽不清]？
>> KEVIN SCHMID：這實際上這樣 開闢一個新的進程來做到這一點。
所以實際上，在某些方面， 邪惡的，不是超級邪惡的，但它是
重要的是說，這是一種 回去，一方面，Apache的
模型中，我們做的線程和進程 對於每個請求，或
進程為每個請求。
因此，這是一種類似於 什麼阿帕奇一樣。
在某些情況下，將僅使用一個新的 線程，這是一點光
重量比的過程，但是Apache可以 最終派生一個新的進程
這是什麼樣的，我們在這裡做的 含蓄地做點斜線FIB 45。
>> 然後在這種情況下，我們種產生 的過程相同的開支。
所以這只是一件事情你可以做。
但只是為了顯示這種運行。
而這次談話只是真正目的 提出這些類型的節目作為
的方式展現不同的視角 如何設計這樣的服務器。
所以這個正在運行，那麼現在如果我這樣做 這一次，我有兩個進程ID。
>> 讓我們只談 事情要指出。
所以請注意，他們是增量。
這很酷。
因為它是27,122前。
但現在通知他們回來 在大致相同的時間。
>> 而現在，一個很好的問題請教一下 為什麼是這樣的，他的工作
是現在它的排序，使這些東西 那種與各自發揮公平
其他的，這兩個實例 點斜線FIB 45，我跑了
或者說節點跑？
那種誰使得它公平，他們都 一種得到平衡的運行時間？
>> 觀眾：[聽不清]。
>> KEVIN SCHMID：是啊。
所以基本上，當我做點斜線謊 45或類似的東西，現在它的
種到操作系統來 處理這些程序的運行時間。
現在它可以安排他們 在不同的CPU或
可以安排他們。
時間可以切片，一個 CPU得到它，或者他們得到
在一個CPU上運行。
所以，這背後的想法。
這是否是有意義的人呢？
所以，現在的節點是不是真的打了 參與瓜分這些任務。
確定。
>> 所以這是幾乎它的例子。
我只是想表明一件事 因為很多這樣的成績一直
不完全超實用 在某些情況下。
我能想像在這之後回家 說話和東西，並說像，
好樣的我離開了那個說話的那 我可以做一個斐波那契服務器
我最後的項目。
因此，這裡只是排序的又一個例子 希望這將是 -
也許不是，但也許 - 多一點 排序相關的最終項目和
超前的思維對這樣的事情。
>> 因此，這是chat.js.
因此，這是一種像一些示例 您可以使用服務器端代碼
設置像一個小的聊天服務器 你可能已經看到在
Facebook的聊天或什麼的。
所以，我並不是說這是像Facebook 聊天，但是這是一種
是個不錯的 - 也許不是很好，但也許 好 - 起點聊天
服務器為您的網站 對於最終的項目。
因此，讓我們來看看它在做什麼。
>> 因此，我們得到這個特別的事情 在頂部，此估計虧損風險SIO
等於要求Socket.IO。
因此，這是它不另外一回事 居然來捆綁
節點，但你可以安裝它。
這是一個節點模塊。
所以它只是像一些 擴展節點。
>> SocketIO實際上是真的 挺酷的。
這是一個抽象的概念，基本上是什麼 它的作用是是它可以讓你
有這種通信流 網絡之間
瀏覽器和Web服務器。
因此，在大多數情況下，到目前為止，我們已經有 這些非常快速一兩秒鐘
網絡之間的第二通信 瀏覽器和Web服務器。
所以它基本上去到google.com，GET 的東西，送它回去，然後
我們就大功告成了。
我們從來沒有再說話，直到 在別的用戶類型。
>> 但是Socket.IO和類似那種 事情 - 和SocketIO實際上是1
那是建立在作為東西 WebSocket的是那種可
作為HTML5的一部分 -
這可以讓你有這樣的 繼續對話。
這是非常有用的在聊天服務器 之類的話，因為它是
有點像在一個持續對話 某些方面，因為如果你聊天
某人，你只要發送一個 消息向下的管子，然後將
服務器可以發送消息了下來 管其他人你
與聊天。
然後你就可以有這樣的 交換這樣的。
>> 所以這是什麼樣的 SocketIO是好的。
這SocketIO使用的WebSockets的原因 作為一件事是，在
除了只是普通的舊的WebSockets， 它也做了一些技巧，基本上
讓瀏覽器兼容。
因此，瀏覽器，如Internet Explorer 不幸的是不支持的WebSockets
正確的開箱即用。
因此它使用了一些其他類型的很酷的整齊 使用Adobe Flash的東西，讓
你有跨瀏覽器支持。
所以這是非常有用的。
>> 而實際上，我知道我是那種 在運行時間在這裡，但CS50
討論，你見過的東西 喜歡，我不知道，空白某某是
回复這個帖子什麼的 這樣，該功能？
這是SocketIO。
所以，當有人開始輸入的 討論箱作出答复或
什麼，你的瀏覽器是什麼 叫SocketIO發出某種
倘若某人說的 回复這個帖子。
>> 然後，服務器說，OK， 我有什麼做的？
現在好了，我要告訴那些其他人 誰是對CS50討論尋找
這個帖子有人回复的。
所以這是什麼樣的SocketIO是 好，這種持續樣的
對話流。
確定。
>> 因此，我在這裡 - 我們只是 將忽略該連接陣列
一點點 -
我做的是我另一個聽。
所以，這只是Socket.IO的方式 說讓我們來聽聽這個端口上。
然後我做這個連接。
所以，這只是基本的Socket IO的 的說法，當我們收到一個方法
就此，我想你 要運行此代碼。
>> 並注意而不是有錄音的 和水庫在那裡通過我的Socket。
與此Socket的想法基本上是這樣 你可以寫和讀的東西
從具有該用戶的 消息可能。
並且，你會發送郵件 可以通過該插座。
這是否有道理？
所以它的這種持續的事情。
>> 所以，我做的是我稱之為Socket.emit。
並發出需要相當 多兩個參數。
第一個參數是一個字符串 剛剛代表的類型
你發光的東西。
因此，對於這種情況下，我已經使用 這個字符串新的消息。
而這只是基本上是說， 這個東西的類型，就是我
發送，是一個新的消息。
所以，你可以偵聽特定類型 像新的消息或什麼
使用點上。
>> 因此，連接和用戶發送那裡，如果 你看看，我們稱之為點上，
這些都是代表其他字符串 類型的用戶的消息。
所以基本上你可以有這個EMIT 1這些消息類型，並
然後做一些回應 這些消息類型之一
>> 所以我發這個新的消息。
我們打算忽略connections.push 一秒鐘。
後來我說，Socket.on用戶發送。
所以現在有點像當 用戶向我發送一條消息，我想
你要運行此代碼。
並注意到，該匿名函數 正在這個變量
所謂數據，基本上會 有用戶的信息。
>> 所以，現在讓我們有種談 連接陣列。
因此，這是專為聊天客戶端 在那裡，基本上每個人的那種在
同一個聊天室。
所以基本上，我們需要保持 周圍是一些陣列，基本上
代表所有的人聊天 從某種角度來說，如果是有道理的。
對不對？
因為我們需要知道是誰那些傢伙 那麼，我們可以向他們發送消息
其他人發送給我們。
>> 所以這段代碼的功能是什麼，當用戶 發送一個消息 - 這是類型
事件 -
我們要運行此代碼。
而我們要做的是，我們通過這個運行 數組，我們稱之為連接。
和幾乎每一個連接 除了一個是我們的，這是
這是什麼碼說，我們發送一個新的 與附加的郵件消息
信息。
>> 所以，如果你在這裡看到，我就是這樣做的時候 用戶實際上使得新
連接我與加 JavaScript.push方法，這是
基本上只是說像添加 該插座作為一個值
我們的連接陣列。
所以，現在這個代碼運行時，它會 送東西給那些特定的
連接。
所以這可能是一個很好的起點 製作一個聊天服務器
或類似的東西。
>> 和那種很酷的事情是， 你在這裡看到的像和代碼
發射和類似的東西是一樣的 樣的JavaScript代碼，你會
寫在瀏覽器中進行互動 用服務器。
所以這就是為什麼SocketIO是怎麼樣的 整齊並以這種方式非常有用。
>> 呵呵，只是一件事真正的快。
有一個CS50最終項目去年 基本上實現了一個聊天
在Node.js的服務器
我認為這是Harvardchats.org 但我不是 -
確定。
我不知道該URL是什麼，但 我後來送了出來。
但是，這是一種什麼降溫 你可以用Node.js的做
>> 所以我希望，在一般情況下，你們有一個 什麼樣的Node.js是很有用的感覺不錯
並如何可以或許申請 您的最終項目。
我將派出更多一些 隨著這個資源。
謝謝你的光臨。
謝謝。
>> [掌聲]