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是很有用的感覺不錯 並如何可以或許申請 您的最終項目。 我將派出更多一些 隨著這個資源。 謝謝你的光臨。 謝謝。 [掌聲]