Кевин ШМИД: Привет всем. Добро пожаловать в CS50 семинара на Node.js. Меня зовут Кевин. Я CS50 TF. И я вроде как очень рады об этом семинаре. Я думаю, Node.js очень здорово. Я надеюсь, что этот семинар может быть использован как хороший, я думаю, трамплин для некоторые из ваших конечных проектов, если Вы заинтересованы в использовании что-то вроде Node.js. Мы вроде начать семинар прочь только что говорили о немного вид фона масштабируемости перспективы Node.js, а затем мы будем двигаться к некоторым примерам кода. И я буду иметь код, указанный на сайте, и вы можете посмотреть на код. И после семинара, я разберусь разговоров о том, как можно настроить Node.js на вашем компьютере. ОК. Так что давайте начнем. Так что я думаю, я просто хочу поговорить о веб-серверы, на самом деле, в первую очередь. И начать эту дискуссию, я в основном имеют схему, которая является от учебник для CS61, которые в основном показывает взаимодействие между клиентским процессом, как ваш веб- браузер или как ваш клиент цели или что-то вроде этого, и веб-сервер. Поэтому такого рода похож на картина, что вы видели в лекции на Среда, где в основном у нас есть некоторые Процесс, как Google Chrome клиент. А потом первый шаг является Клиент посылает запрос. Так что может быть что-то вроде хорошо давайте посетить, я не знаю,, CS50.net. Так мы выдаем эту просьбу. И кто-нибудь вспомнить название протокол, который определяет, как, что Запрос должен быть структурирован? Да. АУДИТОРИЯ: [неразборчиво]. Кевин ШМИД: Совершенно верно. Так что это, как HTTP, не так ли? Поэтому в основном спецификация для как , что запрос должен быть фактически положил вне, потому что в конце дня, что запрос на самом деле просто нравится Строка, в основном говорит, что я хочу этого. И спецификация потому что это HTTP. Так вот, как протокол. Итак сервер получает что запрос. Так вы, ребята, установлен веб-сервер в CS50 прибора. Это Apache. А на этой неделе, когда вы работаете над проблемой установить семь, вы на самом деле будете работать с этой веб-сервера. Таким образом, сервер получает этот запрос, и то он должен рода поцарапать его голова и сказать, как хорошо, что мне делать с этим? Так на основе того, что он решает делать, то это, возможно, придется связаться с какой-то ресурса. И этот ресурс может быть много разных вещей. С одной стороны, это может быть просто как статического HTML файла. Так это может быть просто, как некоторые HTML, что, как для Ваш личный сайт. Это может быть статический файл как образ или как в кино, что у вас есть. Это может даже говорить в какой-то базе данных как базы данных MySQL. Так что не всегда приходится общаться с ресурсом, но в В некоторых случаях это могло. Итак, что он собирается делать после этого это собирается отправить обратно ответ. И ответ на это также задается HTTP. Так то клиент может получить его. Это может разорвать его на части и обработать его. И тогда вы получите веб-страницу как Google или CS50.net или все, что вы пошли в. ОК? Так что это основное взаимодействие, что мы собираемся иметь дело с. И мы в значительной степени будет сосредоточив внимание на этой части взаимодействие, сервер. ОК. Круто. Кто-нибудь есть какие-либо вопросы до сих пор? ОК. Так как мы уже говорили, веб-сервер получает этот запрос HTTP, а затем выдает этот HTTP ответ. И, как мы говорили раньше, CS50 прибор веб-сервер Apache. Поэтому, когда вы, ребята, работать на P установить семь, вы собираетесь работать с Веб-сервер Apache. Вы никогда не будете иметь, чтобы действительно работать с Apache непосредственно слишком много. Вы вроде настройки Apache немного при указании виртуальные хосты или в V хозяева, и мы получим к тому, что в немного. Но в основном, веб-сервер Apache настроен на работу с PHP рода из из коробки. Так что на самом деле происходит, когда вы идете в одном из ваших сайтов, как, скажем, локальный хост слэш index.php или что-то, Ваш браузер посылает, что Запрос, а затем Apache сидит там и выясняет с ним делать. И действие это выполнить что код в index.php и затем отправить его обратно. Так что есть что. Так мы вроде говорили об этом. Так он может просто служить статический файл или запустить некоторые PHP код, а затем вопрос отклик. Итак общий вопрос, который может прийти до хорошо, как мы на самом деле дело с наличием нескольких пользователей в то же время? Итак, представьте, если бы вы писали полотна сервер, если у вас есть веб-сервер, что вы пытались написать в чем-то как C или что-то вроде этого, в основном вы можете думать о том, как там может быть какой-то код, что бы получить запрос, но потом он должен делать всю эту работу на нем. Она может иметь, например, обратитесь базы данных или что-то в этом роде. Не так ли? А потом он будет делать такого рода переработки, а затем отправлены обратно ответ. Так вот, как высокая Обзор уровня. Но это не сразу видно, как вы может сделать это так, чтобы два человека или даже 1000 человек мог работать с вашим Веб-сервер одновременно. Таким образом, решение, которое использует Apache называется потоков или процессов. Таким образом, вы, возможно, слышали эти термины раньше. Это нормально, если у вас нет, но просто думаю, о потоках или процессах, как путей операционная система или программа пользователя или что-то в этом роде или веб-сервер к виду выполнить несколько вещи сразу. Таким образом, вы, возможно, слышали термин как потоков выполнения. Так что это вроде как ты рода многозадачности. И если вы видели на поле по вашему ноутбук, или что-то вроде этого, многоядерных, что вы можете сделать, это можно запустить две разные темы, на разные части процессора, чтобы они могли на самом деле происходить одновременно. Так что это очень мощный. И это своего рода в Apache Решение этой проблемы. Так есть вроде как любым вопросам при таком подходе, хотя? Так что я думаю, я вроде написал их там. Но оба они рода использовать много памяти. Это очень дорого для создания нить или процесс. И часть рассуждений в том, что только например, когда вы работаете в программу C как ваш главный, а затем, что звонки другая функция, которая имеет какая-то стека. Так темы также требуют полностью отдельный стек, который может быть довольно большим. И если вы можете представить себе, тонн пользователи на ваш сайт, вам придется много разных потоков. Это много стеков для управлять и поддерживать. Так что это большое потребление памяти. А потом, также, скажем, у вас есть только один процессор, или, скажем, у вас есть больше потоков, чем у вас есть те многожильных. Не так ли? Так скажем, у вас было 10 темы и у вас только пять процессоров. Вы вроде должны сделать эту вещь, где переключении между током тот, который работает, потому что вы не может выполнять все 10 сразу. И это называется переключение контекста. И этот термин на самом деле есть несколько различных контекстах, но давайте просто думать об этом как переключение между двумя потоками. Это может быть довольно дорогим, потому что основном то, что вам нужно сделать, это вы должны остановить то, что вы делаете, за исключением состояние этого момент потока, и затем переключиться на другое место. Значит ли все это за см. мотивация, почему темы и процессы могли бы быть немного громоздким? И разве у вас есть вопрос? ОК. Круто. Кто-нибудь есть какие-либо вопросы? ОК. Так что если мы делаем шаг назад в течение секунды, там вроде как Наблюдение, что мы можем сделать о много веб-приложений. И это действительно так многие из них на самом деле не делают этого много полезной работать внутри волоске. Так Кто-нибудь началась P установить семь вообще? Так что вы хотите, может быть, описать некоторые из частей? Работали ли вы при входе или что-то в этом роде? АУДИТОРИЯ: Нет. Кевин ШМИД: ОК. Не берите в голову. Извините. Но в принципе, в P набора, вы собираюсь делать много рода запросы к базе данных, чтобы получить некоторые Информация из этой базы данных. И то, что ваш код будет делать, что это процесс Apache или что Apache поток собираетесь делать в то время как он должен связаться база данных это своего рода будет сидя там, и это будет ждет база данных, чтобы ответить. Теперь, когда не может звучать как то, что большой дело, поскольку база данных находится на вашем CS50 прибор, не так ли? Но есть какая-то сети время ожидания там, потому что в настоящее время веб- сервер должен выдать свой собственный запрос, чтобы база данных для связи с базы данных и затем получить, что Информация назад. Так что теперь это как хорошо жди меня, я собираюсь пойти получить что-то от базы данных и затем есть большое ожидание происходит. Имеет ли это смысл? И для некоторых вещей это не так уж плохо. Если это просто необходимо, например, запоминающее устройство, что не так, как ужасно задержки ввода / вывода. И когда я говорю, задержки ввода / вывода, что я в виду это как и любой вид, как исходные данные. Но получить доступ к файлу на диске, как если бы я хотел, чтобы служить статический HTML файл, который был на моей веб-странице или что-то в этом роде, я вроде должны остановиться на некоторое время, прочитайте файл с диска, а затем в что процесс я жду. Я не делаю полезную работу. Это не верно ни на что, но это обычно в приложениях, таких как P набора семь и много приложений что вы не на самом деле делает много думать. И когда я говорю мышление, я имею в виду как вычислительной работы. Так вычислительная работа может быть что-то как, скажем, вы хотите, чтобы написать веб-сервер, что просто, вычисленный п-число Фибоначчи. Это не звучит как особенно весело веб-сервер. Как я не ожидал бы, что сайт, чтобы быть на следующий Facebook, но это некоторые вид вычислительной работы. И вы можете себе представить замены, что с некоторый другой вид интересно вычислительная работа. Допустим, вы писали что-то рассчитанной степеней Разделение между двумя людьми или что-то в этом роде. Так что действительно подразумевают какую-то из расчета, не так ли? И даже тогда, делать, что вы до сих пор сделать много ждать, может быть, у вас есть запрос к базе данных, чтобы посмотреть до кто дружит с кем или что-то в этом роде. Так что есть такая понятия вычислительных работ. Имеет ли это смысл? Кто-нибудь есть вопросы? О, и я предполагаю, что я положил чата есть потому чата серверы являются своего рода еще один хороший пример. Чат сервер не имеет сделать много думать. Он просто должен ждать для людей, чтобы отправлять сообщения и затем, когда они, отправить их. ОК? Так что просто резюмировать снова, Apache и аналогичных веб-серверов, таких как этого вилкой много потоков и процессов, которые может быть даже расточительно. Так что я думаю вопрос, который может прийти от который мы должны иметь несколько потоков и процессов? Что делать, если мы просто был один? Так что давайте рода нарисовать картину о том, что это будет выглядеть. Так что давайте использовать только один поток. ОК? Только представьте это с одним потоком. Давайте предположим, что мы действительно не делали что много полезного - и когда я говорю полезно, я имею в виду вычислительную работу - в тех нескольких потоков раньше. Так что давайте рода консолидации все в одном потоке. Так что, если у нас была одна нить, которая вид просто идет вокруг в контуре и постоянно проверяет сделал что-то Новый случиться. Так, например, что-то новое случилось может означать, что я получаю ответ от база данных, или кто-то послал мне новый запрос HTTP. Итак, это своего рода событий что произошло, не так ли? А потом, что я могу сделать, когда новичков вещи происходят в этом же потоке исполнения, это один поток исполнение, я могу назвать некоторый код, который будет обрабатывать эту конкретную вещь. Так, например, если бы я получил что-то взамен из базы данных, я мог запускать мои небольшой вычислительная часть, которая на самом деле просто готовит вещь отправить обратно пользователю. Так же, что это за смысл? Но то, что действительно Последствия этого? Не так ли? Потому что мы написали много кода этого - и я просто хочу, чтобы перейти вперед в слайдах, если это нормально. Так что, если вы не возражаете, я просто собирается сделать шаг назад. Так что это рода вещи называется цикл событий. ОК? И это отчасти основной Идея Node.js. Так что Node.js действительно делает как сеть сервер есть один поток что в основном происходит вокруг в цикле как во время одного вида нижним капот Node.js это постоянно проверки, так как мы получаем новые вещи? И затем она будет работать обработчики что вы создали. Но хороший вопрос, чтобы спросить, как мы можем сделать это произойдет с существующих вещей? Так что я положил линию C кода здесь в основном похоже, что это открытие подать, правильно? Я Она только что вышел с альбомом. Так что мне пришлось открыть ей новый файл. Так устроена наша C код для работы - и я предполагаю, что причина, я выбрал файлы было потому что это своего рода такой степени, работы ввода / вывода, что мы сделали в C в чувство, что есть вход выход. Так мы называем это код, который делает это е открытым. А потом на следующей строке нашей Программа, теперь мы можем работать с ф. Так что это будет пример того, что вот как синхронный или блокируя потому что в этот первой линии там мы не ждем, пока мы получить открыть файл. Так на второй линии, мы знаем, что мы может работать с е, но это означает, что что вторая линия не могу запустить пока первая линия не будет сделано. Имеет ли это смысл? Так что это было бы плохо, чтобы положить в обработчике событий. И причиной тому является то, что этот вид ждет, не так ли? Так что это вернется нас к тому же. И теперь мы даже не придется Преимущество нескольких потоков или процессы, потому что мы получили кто-нить в Node.js. Имеет ли это смысл всем? АУДИТОРИЯ: Подождите. Так в чем же замена? Кевин ШМИД: О, да так. Так что я собираюсь добраться до замена. ОК. Так что, если у нас было что-то , который выглядел, как это? Так что, если сейчас я редактировал е открыть мало? Так я передаю в то же самое два аргумента, как раньше. Я все еще люблю новую песню что она вышла с. Но я передаю третий вещь, которая эта переменная называется код. Но то, что код на самом деле в этом контексте? Это как обычный переменной C? Это функция, не так ли? И это может быть немного странно, потому что Я на самом деле, как сейчас проходя функционировать в другую функцию. Так пара вещей, чтобы отметить об этом. Один из них, я на самом деле не называя код функции. Таким образом, вы не видите код с осталось Парень, прямо скобка. Я просто проходил в коде. А в С, что это будет на самом деле это дать мне указатель на что фактическая Код, и то это может запустить его. Но подумайте об этом, как вы передавая код для запуска, когда открыт этот файл. Но что это означает, что в настоящее время Остальная часть моей программы, которые могли бы сделать другие вещи, может продолжать делать другие материал в то время как мы, на самом деле не ждать, но просто в задней части наших головах, что В открытом состоянии, пробег этого файла, что код в верхней части. Имеет ли это смысл? И теперь идея Node.js является то, что код в работаем с ф часть должна быть довольно коротким и простым и прямой, а не действительно очень большого объема вычислений. Это, возможно, придется открыть другой файл, но что также должно быть довольно быстро потому что это должно только сказать сделать еще один е открыть, а затем вызвать этот другой код. Так просто быть совершенно ясно, е открыть, что делает новая песня Кэти Перри сделано mp3, что собирается довольно гораздо немедленно вернуться. И тогда мы можем просто продолжать делать другие вещи, потому что все, что сейчас е открытый конкурс, оказывающий сказать основном основной е открытым кодом открыть этот файл и когда вы закончите открытия этого файл или когда вы получите его обратно, затем запустить этот код. Но это не реально работать этот код. И у вас был вопрос? АУДИТОРИЯ: Вы, кажется, подразумевает, несколько раз, что добавление в вычислительном интенсивное код рода перерыв [Неразборчиво] приводится система. [Неразборчиво]? Кевин ШМИД: Это большой вопрос. Так что я на самом деле имеют пример того, как вы могли бы интегрировать в вычислительном интенсивное код в немного. Поэтому, когда мы перейдем к примерам кода, Я обязательно тянуть, что один. Разве что в порядке? Спасибо. Какова была ваша фамилия? АУДИТОРИЯ: Аарон. Кевин ШМИД: Аарон воспитывает очень хороший момент, который является то, что если бы мне пришлось некоторые вычислений код в сделать материал с е части, остальная часть моя программа не может работать и не может слушать для новых запросов или что-нибудь, пока все что материал закончена. Так что если я пишу Node код в целом если мы не сделаем что-то, что я собираюсь предложить позже, когда мы смотрим на примеры кода, я должен быть уверен, что мой код не связывает это цикл событий. Имеет ли это смысл? ОК. Круто. Так Node.js предлагает эти рамки, что Вы можете построить эти события приводом серверы с. Так что имеет такого рода асинхронных без блокировки ввода / вывода библиотеки, в то время как стандартные C библиотеки, которые мы были работать, как если бы вы просто использовать их таким же образом, что мы использовал их с F открывается и материал, те, блокируют, потому что вы на самом деле должны ждать что файл для открытия. Но Node.js дает, что и ему в основном набрасывается на V8 от Google JavaScript двигатель, который является причиной что Chrome настолько быстро при обработке JavaScript, потому что есть этот двигатель V8. Так что я знаю, это звучит, как один из тех, WWDC конференциях разработчиков вещь где они просто выбросить кучу Письмо количество вещей для процессоров и говорят, что это так здорово. Но это здорово, что они сделали это потому, что JavaScript - или, может быть, если вы не знакомы с JavaScript еще потому, что у нас не было лекции на нем - но JavaScript является интерпретируемым язык. И это очень важный момент тоже. Так что это важно для нашей сети серверы, чтобы быть быстрым, не так ли? И если мы просто бежали Javascript Код, который был интерпретирован только с любой старый переводчик это может быть медленным. Так узлов выгоды от того, это супер быстрый интерпретатор V8. И я не знаю, если они назвали его потому что V8 удар в лоб вещь, но хорошо. Так я подготовил несколько примеров по следующему адресу. После семинара, я как бы собирается говорить о том, что вы можете получить Node Set , но сейчас, я просто как бы хотят ходить через некоторые примеры кода. Так что если вы хотите проследить, все Исходный код доступен там. ОК? Поэтому я оставляю этот адрес на немного. А потом я просто хочу, чтобы перейти в терминал. Неужели все хорошо с этим URL? Так что я собираюсь перейти на в моем терминале здесь. Итак, вот код, который У меня есть на сегодняшний день. Почему бы нам не начать с simpler.js файл? Другое дело, что все это Код собирается записать в JavaScript, который вы можете или не можете быть знакомы с. Я думаю, пара вещей является то, что много кода JavaScript является вид Синтаксис и структура очень похожа на С, так что вы можете отчасти забрать его, как вы идете вперед. Я пытался написать много начиная код для этого в способе, которым это похож на С, так что это немного более читабельным. Но, как мы продвигаемся, я буду демонстрируя некоторые из дополнительных особенности JavaScript, что являются круто. Но давайте посмотрим на эту программу образца. Я думаю, все это отрезали там. Я просто хочу, чтобы исправить, что реальные быстро, если это нормально или нет. Я не знаю, что это будет делать. Разве что немного лучше? Видите ли вы вар и прочее? ОК. Таким образом, первая строка, как JavaScript версия переменной Декларация. Так что просто выделить то, что это будет выглядеть в С. Так что это так же, как мне говорят индекс равен три или что-то в этом роде. Так что я не указать тип. JavaScript имеет виды, но это очень динамично набрал в природе, поэтому не предусматривает какие-либо типа на нем. Так он просто должен вар. Это как переменной. ОК? И я звоню этой переменной HTTP. И на моей правой стороне, у меня есть выражение, что я хочу, чтобы положить в HTTP. И это говорит требуют HTTP. Так что это своего рода похожи включить. Это немного больше, как мощный, чем включить в том смысле, что включает просто скопируйте и вставьте заголовок файл для прототипов функций или что с определениями типа. Но требуют на самом деле происходит чтобы получить нам код. Таким образом, вы можете думать об этом как импорта некоторый код. Так где-то в модуле Node.js Система или любой другой, у них есть все это Код HTTP сервер, так что я просто извлечение его для моего собственного личного пользования в этой программе. ОК? Тогда я иметь эту функцию что я написал. И заметьте, я не должен был указать возвращаемый тип или тип аргументы еще раз. Так вроде свободно набраны в Это своего рода чувство. Два аргумента, что он принимает в, запрос и ответ. Так вот концептуально вроде как знакомы с картинки, которую мы имели на экране раньше, потому что мы получаем эту просьбу, что мы иметь от пользователя. И тогда у нас есть ответ, который мы можем написать вещи. Таким образом, первая строка это делает res.writeHead 200 и затем эта тип содержимого текста равнина. Так что давайте собрать это кроме немного. Так что давайте просто сосредоточиться на res.write для немного. Так пишут в основном, и написать голову, просто способы рода выписать вещи в ответ. ОК? Так что пишите голову, если кто-нибудь помнит от HTTP лекции, вы, ребята, помню заголовки в Верхняя часть HTTP вещи? Так почему бы мне просто не демо заголовки действительно быстро. Это было бы полезным? Или мы должны только вид - ОК. Конечно. Поэтому, когда ваш браузер идет в google.com или что-то в этом роде, там на самом деле немного больше - это как тайну - там походит немного дополнительной информации , который приходит через трубу, чем просто немного поиск и все. Таким образом, чтобы показать вам это, я собираюсь использовать программу под названием Curl. ОК? Так это то, что вы можете работать на командная строка Mac OSX или в Прибор или любой другой. И поэтому, если я Curl HTTP google.com, Я собираюсь увидеть HTML. И это, справедливости ради, просто HTML такого рода говорит вам, чтобы перенаправить на WWW, если ваш браузер не автоматически обрабатывать перенаправление. Так что это только HTML, но я собираюсь добавить в Curl эту дефис Я флагом. ОК? И это собирается показать мне заголовки. Так что это также информация, которая поступает через когда я получаю такой ответ. ОК? Так на самом верху, вы видите это HTTP 301 постоянно двигаться. И это своего рода важно, потому что это относится к коду статуса. Таким образом, 301 вот код статуса, который является в основном только целое число , который указывает браузеру или кто бы ни Прочитав это, если вы делаете вид, что ты браузер и вы видите это, в основном сейчас, если вы посмотрите на что и вы видите 301, вы знаете, у меня есть сделать что-то особенное на основе 301, или что-то особенное произошло на основании 301. Так он говорит переехал на постоянное жительство. И то, в основном, у нас есть куча пар ключ-значение. Итак, мы получаем расположение является www.google.com. А потом вроде все это другие вещи, но в основном, то, что расположение поговорка новое место находится на www.google.com. Так что теперь, если вы идете в google.com, вы будете рода см. браузера рода мгновение на секунду, а затем перенаправить вас обратно к www.google.com. Таким образом, ответы могут содержать эти заголовки. И несколько вещей, чтобы указать. Так скажем, мы были фактически успешным в посещении веб-страницы. Итак, позвольте мне перейти к - что такое хороший сайт? Я плохо мышления хорошо сайты на месте. АУДИТОРИЯ: Wikipedia. Кевин ШМИД: ОК. Давайте сделаем Википедию. Так вот, я был перемещен. Ой, подождите. Был я? Да, я был. ОК. Так что я должен делать WWW. Так что я собираюсь сделать WWW. И как вы можете видеть, здесь все HTML , что браузер будет обрабатывать для Википедии. Но если я буду продолжать прокрутки вверх здесь, что я буду видеть в верхней - ничего себе, есть много HTML в Википедии - но то, что я вижу в верхней здесь это 200 код состояния в отличие от 301, что я видел раньше. И заметьте, что у него есть хороший дружелюбный ОК рядом с ним. Так что это как хороший кодом состояния. Выглядит ли, что 200 номер знакомы? Да потому что, когда я сделал simpler.js, Я написал 200 там. Так вот в основном говорят сказать браузеру или тот, кто пытается добраться до это, что они были успешными. Или то, что вроде как мы были успешными тоже. И есть такая специальным синтаксисом в Javascript для объявления Карта из этих клавиш, как тип содержимого и эти значения как текст равнине. Так что, если вы посмотрите на ответ, что мы вернулся из Википедии и раньше, - Я собираюсь попробовать прокрутить до чуть быстрее - у вас есть эти ключи, как сервер и эти значения Apache. Итак, вы получили ключи и значения. И вы можете указать это в Node что отправить обратно. Так что это на самом деле вид, в некоторых способы, и в некоторых отношениях это не действительно, но это немного более низкий уровень чем код PHP, что вы могли бы быть писать для P установить семь, потому что PHP и Apache рода заботиться о некоторых из этих вещей для вас. В PHP, вы можете переопределить значение по умолчанию поведение, написав свои собственные заголовки. Но для целей это, мы получаем выписать наши собственные заголовки. Значит ли это, линия имеет смысла все, глава записи линия? ОК. Потрясающе. Так что я сделать, это я в конечном ответ сказав привет мир. ОК. Но это только функция называется обработчик запросов. Так что теперь я на самом деле нужно рода делать что-то с этой функцией, не так ли? Так вот то, что я делаю, это там это линия, которая делает равных уаг сервера HTTP.create сервер, а потом я пройти в обработчик запроса. Так что это своего рода Узла способ создания сервера. И заметьте, что я передаю в обработчик запроса. Так что это говорит createServer Функция, что я хочу, чтобы ты меня сервер, и когда получает, что сервер ответ, мне нужно, чтобы назвать это запросить функцию обработчика. ОК? Так что линия в значительной степени заканчивается сразу же. Таким образом, сервер линия вар сделано правильно после этого в значительной степени. Я имею в виду, он должен настроить некоторые внутренние Государство знать, что вы должны были бы вызова этой функции обработчика запроса, но он не собирается сидеть и скажем имеет пользователю отправляется мне запрос еще? Имеет пользователь прислал мне запрос еще? Так что не блокирует. ОК? Так что же это будет делать это в основном теперь хранит указатель на этот код, эта просьба функция обработчика, а затем будет работать этот код, когда кто-то делает запрос. А потом мы делаем server.listen. 1337, там довольно произвольно. У меня не было особых причин для сбора этот номер. Это было совершенно случайно. Но это только указывает порт. Так большинство веб-серверов вы увидите, что они использовать порт 80, потому что это своего рода вроде конвенции. Так что, если я иду на что-то вроде, Я не знаю,, Wikipedia.org, и я положил толстую кишку 8 - о, ничего себе, вы не можете видеть, что. Мне очень жаль. Но если я Википедию - Я напишу его здесь просто так, что понятно, на камере. Но если я возьму это в браузере с двоеточие 80, что указывает перейти к Wikipedia.org на порт 80. Так что это как то, как Соединенные Штаты несколько портов, как, где вы можете отправить вещи для вида. Так что это, как пойти в этот особый разместить на этом сервере. ОК. Так что я просто выбрал 1337. Там целый диапазон чисел что вы можете выбрать. Это не было полностью особенным. Но то, что я собираюсь сделать сейчас это я собираюсь запустить узел. Позвольте мне на самом деле ввести, что пара линии вниз, так что вы можете увидеть его. Я собираюсь сделать узел, и я собирается запустить simpler.js. И мы будем говорить о том, как получить Узел создан в немного. Но теперь это просто управлять сервером. Таким образом, одна вещь, которую мы можем попробовать, который не может то, что интересно, мы можем на самом деле попытке доступа к нему в Curl. Так что я могу сделать Curl, и мой Машина локальный хост. Вы также увидите, что это написано как это иногда. Часовой хозяин и 127.0.0.1 добры вроде вашего домашнего компьютера. Так что это как разговаривать с ваш собственный компьютер. ОК. И тогда я могу сказать, 1337. Так что, если я запускаю эту строку кода, он говорит привет мир. И если бы я хотел видеть, что материал, который был текст типа контента простой или все, что я мог даже поставить это здесь. И заметьте, что это действительно говорит ОК. И у меня есть текстовый равнину. А тут еще вроде все это другая вещи, которые узел добавит в там для меня. Это не супер важно. Я имею в виду, есть какая-то техническая аспекты в то добры круто говорить, но просто чтобы показать, Вы, я также имеют право изменить их вокруг. Поэтому я могу только добавить кучу из все в таком духе. И то теперь, если я смотрю в моем выход, это будет что. Таким образом, эти заголовки в виду определенные вещи к браузерам и тому подобное. И заголовки могут в основном рассказать браузер как реагировать на что-то. Если вы когда-либо слышали о печенье и раньше, или если вы когда-либо были раздражены Установив печенье веб-страницы, или не включен печенья блока или что-то в этом роде. Вы на самом деле можете установить печенье в этих заголовков. Так они говорят браузеру, как поведение в некоторых случаях. ОК. Так, чтобы было simpler.js. Кто-нибудь есть какие-либо вопросы на этом файле с исходным кодом? ОК. Круто. Так что давайте удалить р от и посмотреть на simple.js. Так что это в значительной степени та же программа. Я просто написал ее немного по-другому потому что я хотел, чтобы разобраться в подсветкой некоторые особенности JavaScript. Так заметить, что обработчик запросов функция полностью исчезли. О да, ты есть вопросы? Аудитория: Да уж, аргументы , которые передаются в том, что Функция, какие они? Кевин ШМИД: Итак, это JavaScript объекты. В документации Node.js, это в основном говорит, что методы доступно на них. Мы просто, оказывается, имеют доступ к этот метод называется голова и конец записи и все в таком духе. Но есть целый букет несколько методов. И например, как один из них в частности, на рек, вы можете сделать что-то вроде rec.method который будет сказать вам, является ли это HTTP GET или HTTP POST запросы и такие вещи, как, что. Таким образом, есть все виды отличаются свойства, но они оба JavaScript объекты, и они просто есть функции, приложенные к ним, что вам можете написать вещи. ОК? Так заметить, что обработчик запросов полностью исчез. Но код, который я имел в запросе обработчик по-прежнему существует. Я до сих пор этот res.writeHead и я до сих пор этот res.end. И то, что это является примером в JavaScript является эта идея анонимная функция. и анонимный, как подходящее название для него, потому что он буквально не иметь имя. Там нет запроса нет функции обработчик там. не имеет имени, но он по-прежнему принимает аргумент. Так что я еще есть запись и разрешением. И я до сих пор код. Это прекрасно JavaScript код. Так что я могу объявить функцию без явно давая ему имя. Это немного запутанным на первый. Есть некоторые, как полезные вещи что вы можете сделать с эти анонимные функции. Кто-нибудь есть какие-либо вопросы по этому поводу, или это хорошо только для, на данный момент, рода просто признать, что это будет делать то же самое? Да? АУДИТОРИЯ: Являются ли функции сначала класс в JavaScript? Кевин ШМИД: Они сначала класс в JavaScript. И точно знаю, что эти понятия переходя в анонимной функции как это относится к JavaScript, что вы может написать в вашем окончательного проекта для веб-браузер тоже. Так, например, в JavaScript в ваш браузер, это также несколько событий въехал в том смысле, что то, что вы будете есть, когда пользователь щелкает этот Кнопка, я хочу, чтобы вы запустите этот код. Так что это тот же самый вид идей на стороне клиента, когда щелчок мыши или они мыши на некоторое изображение на вашем веб-страницы, запустить этот код. Это можно применить к серверам. Так что вроде как интересно Причина, почему JavaScript является действительно подходящие или некоторые люди думают, что это подходит язык для этого вида Сервер водитель событие, потому что у вас есть эти анонимные функции. У вас есть вся идея это асинхронный код. ОК. Кто-нибудь есть какие-либо вопросы? ОК. Так, чтобы было simple.js. Итак, давайте взглянем на еще один или еще пару. Так что это sleep.js. Так кто-нибудь знаком с функция сна C? С может быть, один из ранних лекций или что-то в этом роде? Поэтому в основном вы можете передать в я думаю количество секунд или если вы используете U спать число миллисекунд или наносекунд. И в основном программа будет просто остановиться работает для того количества времени. Не так ли? А потом проснется в конечном итоге и то это будет просто продолжать работать программа. Так этот сервер рода дает впечатление от сна. Так заметить, что у нас есть то же самое res.writeHead 200 с заголовком, как и раньше, но тогда мы называем это Функция называется набор тайм-аут. Установите тайм-аут также доступен в ваш веб-браузер Google Chrome или Safari или любой другой. И в основном, что он делает здесь будет это занимает в функции. Обратите внимание, опять же, это анонимная функция. Так вот круто, потому что мы используя анонимную функцию в анонимная функция, которая может быть немного странно. Но это занимает эту функцию, которая в основном говорят - и то, как это Работы в 5000 миллисекунд, я хочу вам выполнять эту функцию, просто заканчивается ответ и записывает эй. Так что это производит впечатление, как спать, но то, как это на самом деле работает, мы будем проходить через эта линия очень быстро. Мы просто писать что-то. И тогда мы будем также запустить через эта линия очень быстро. Так что мы на самом деле не собирается ждать пять секунд. Мы просто собираемся запустить этот код мгновенно. А тут еще, опять же, это немного цикл событий, что в настоящее время это дело регистры, что в основном является просто постоянно происходит по кругу и, глядя на часы в один нить и поговорка, имеет пять секунд Прошло еще? А потом, когда он видит, что второй рука двигалась, как пять секунд или все, то просыпается и говорит: ой, что я должен делать? О, я должен выполнить этот код. А потом он собирается запустить res.end эй. Итак, еще раз, мы никогда не ждали здесь. Так что это не то, что этот код внутри эта функция будет принимать пять секунд для запуска. Этот код будет работать в значительной степени мгновенно, по крайней мере, относительно пять секунд, что мы говорили о ранее раньше. Так только, чтобы показать это в действии, Я могу сделать Node.sleep.js. И я беспорядок что-то? Возможно. Извините. Давайте посмотрим, что мы можем сделать, чтобы исправить это. ОК. Так определенно использовать Node.js. Шучу. ОК. Только один сек. ОК. Я знаю, что это такое. Так что вопрос в том, что в другой мой счет здесь, я бежал узел уже на что же адрес, 1337. Таким образом, ошибка, что это бросил, если мы посмотрим на него в реальном тесно, является адрес в использовать, EADDRINUSE. Так что я уже использовал 1337 здесь. Так что, если я закрыл это прочь, и тогда я сейчас попробуйте запустить этот, надеюсь, все будет хорошо. ОК. Таким образом, вы можете иметь только одну вещь рода из прослушивает порт сразу. Другим решением было бы для меня просто редактировать эту программу и сделать это походило 1338 или что-то так. Но теперь сон бежит. Так что давайте на самом деле попробовать его в браузеру на этот раз, потому что это немного неинтересный, чтобы увидеть это в терминале. Так что я просто собираюсь идти к тому, что 127 адрес снова в 1337. И если вы можете увидеть его - Я не знаю, если вы можете - но мой браузера с очень, очень долго Время для загрузки или как пять секунд. А потом после этого, он, наконец, закончил ответ. И вы не можете видеть это, потому что вещь перемещается на немного, но если я сделаю это немного меньше, вы можете видеть, что говорит эй. Таким образом я получил эй, но через пять секунд. И это может быть немного более чистым, чтобы увидеть это здесь на терминале, так что я собираюсь сделать - давайте сделаем здесь - давайте сделаем Curl этому адресу снова с 1337. И я только отчасти должны сидеть здесь в течение пяти секунд. Но обратите внимание, что сервер может принимать новые ответы. Так он печатает эй. И для демонстрации этого, в основном, что Что я могу сделать в этой другой вкладке - так скажем я делаю это в другой вкладке, Я собираюсь сделать Curl и то же вещь снова. И я собираюсь попытаться пнуть их ребята прочь в то же время. Так что я собираюсь сделать это, и я собираются гонке здесь, и я собирается сделать это снова. И давайте сделаем так, что вы можно увидеть их обоих. Это один напечатаны эй и что один напечатаны эй всю дорогу в - давайте сделаем этот эксперимент еще раз. На самом деле, давайте использовать это обмануть, если это нормально. Так что я собираюсь использовать оболочки вещь, которая позволяет мне в основном запустить две копии данной программы параллельно. Так он будет работать первую программу и вторая программа параллельно. Так что теперь, если я нажимаю Enter, он собирается сделать, что запрос в значительной степени мгновенно в то же время. Так давайте дадим этот выстрел. Так что теперь заметите, что он говорит два процесса. И если вам интересно, что 27000 число в основном процесс ID. И обратите внимание на то, что они напечатаны эй одновременно. Это не было похоже нам пришлось ждать пять секунд для одной и то после того, через пять секунд получить второе. Так вот вид, в некотором смысле, это на самом деле не свидетельствовать, но это интуитивное доказательство того, что это не просто как ожидание пять секунд и блокировки весь поток. ОК здорово. Аарон задал вопрос ранее, что было, хорошо, что если мы что-то сделать - Да? АУДИТОРИЯ: Подождите. Как это отличается от Е буфера, хотя? Разве это не автоматически это сделать? Почему мы должны беспокоиться об этом? Кевин ШМИД: О, ты мог сказать, что еще раз? АУДИТОРИЯ: Не любит Printf буфер сделать ту же самую вещь? Кевин ШМИД: Буфер Е? АУДИТОРИЯ: Да. ОК. Был не в одном из опросов они были говорить о том, если вы прямо Е что-то, а затем уже он паузу один Вторая, а затем у вас есть это цикл десять раз, это будет ждать десять секунд и затем Е все вместе? Кевин ШМИД: О, хорошо. АУДИТОРИЯ: Это делать то же самое вещь, то в этом случае? Кевин ШМИД: Таким образом, вопрос был в основном в одном из бывших викторины или что-то, возник вопрос, что в основном, если вы говорите, для печати F 10 вещи в то время, а затем спал как в процесс печати тех из, в конце почему-то, что это будет просто свалка тех, все на экране. Так что вроде двух разных понятия здесь. Так что я думаю одно, что в этом так, что мы имеем дело с двумя различными рода люди просят сервер для вещей одновременно. И причина того, что Е рода ждет, как это и свалки все это сразу больше связана с как Е рода - поэтому путь Е на самом деле реализуется это в основном должен поговорить с операционной системой писать что материал на консоль. Так что не хотите, чтобы сделать все, что материал сразу, когда вы говорите Е некоторые строки, потому что мог дорого обойтись, если он должен сделать это в любое время. Так что, если вы делаете Е эй, вашу программу не может на самом деле печатать, что сразу на консоль. Это можно сказать, хорошо, я ее написал. А потом вроде ждать вас, чтобы дать это немного больше, прежде чем на самом деле записав его на консоль. Так что причина, что бы это было так - и это отчасти связаны в сон - является то, что сон был своего рода просто вводят туда, чтобы продемонстрировать Дело в том, что он не записывает это синхронно. Но причина, что это просто производительность, так что вы не должны сделать, что многие контакты операционная система. Но вот то, что мы действительно пытаемся сделать с этой вещью сна является лишь шоу , что, когда у нас есть два людей, посещающих этот сайт, он не собирается ставить их в линии, где он собирается сказать У меня есть, чтобы помочь вам, а потом, когда я полностью закончил помогать вам после них пять секунд, то я собираюсь перейти на следующий человека. Так запрос первого лица не связать, что цикл событий если это имеет смысл. Но здесь на самом деле пример чего-то, что свяжет до цикла событий. Итак, вот ужасная функция вычислить п-ю Фибоначчи. Это буквально в худшую сторону, как вы можете вычислить энного количества Фибоначчи. И это на самом деле просто признать откуда это взялось, там на самом деле - Я имею в виду, вы можете попробовать пойти найти его - но есть как очень длительный блоге сообщение, что кто-то написал. Это как один из тех Reddit вещей. Но кто-то критиковал Node.js, и они использовали это в качестве примера. Так что я отчасти хотел просто показать вам два различные точки зрения только, чтобы получить общее понимание понятий За этими двумя вещами. Но это выбирается в качестве просто ужасно, ужасно неэффективен вычислительно интенсивное способ вычисления энного количества Фибоначчи. Так же, как примечание стороны, почему это ужасно, как в той? Да? АУДИТОРИЯ: Допустим, вы начинаете с 1000. 1000 распадается на 999 и 998. Каждый из этого распадается на две вещи. Каждый из этого распадается на две вещи. Кевин ШМИД: Верно. АУДИТОРИЯ: Всю дорогу вниз. Кевин ШМИД: Совершенно верно. Так что просто повторить для камеры, если я позвонить Фибо на как 1000 или что-то так, это, очевидно, не менее или равное единице, так что я собираюсь пойти в этот еще случае, а затем я собираюсь позвонить Фибо 999 плюс Фибо 998. А потом в значительной степени все, что работа, которая Фибо 999 делает вид на этом уровне. Если вы идете вниз, то это еще более избыточным Кроме этого, но если вы просто думаю вычисления выдумка 998 получает нам довольно близко к Фибо 999. Таким образом, мы должны действительно быть немного более умный о том, как мы отчасти повторно них, но мы не повторного использования эти вещи вообще. Таким образом, вы можете себе представить, этот гигантский, гигантский дерево, которое просто ужасно. Но в любом случае, хорошо. Так, чтобы было выдумка. Это займет некоторое время для запуска. Да? АУДИТОРИЯ: [неразборчиво]. Кевин ШМИД: О, ты мог повторить вопрос? АУДИТОРИЯ: [неразборчиво]. Кевин ШМИД: О, так это только код что будет своего рода на на стороне сервера. Так что это не будет найдено в браузере или что-нибудь. Это в основном то, что мы есть, что когда пользователь здесь довольно много марок их просьба снова, когда мы вроде сделать запрос, мы собираемся назвать эта функция на стороне сервера. А потом мы получим результат обратно от вызова этой функции. А потом мы просто напечатать это пользователю. Таким образом, пользователь на самом деле не дело С помощью этой функции слишком много. Был, что вопрос? Имеет ли это смысл? ОК. Круто. Итак, еще раз, мы делаем все это res.writeHead вещь, где мы распечатать заголовок. А потом я в конечном ответ, делая магическое число выдумка 45. Так что давайте просто запустить этот сервер. Так что я собираюсь сделать узел fib.js. Так что теперь моя выдумка сервер работает. А потом здесь, я собираюсь сделать один из них. ОК? Так что я просто хотел сказать, Curl. Так что это займет некоторое время, но мы надеемся, скоро он закончит и он будет печатать, что 45-й Число Фибоначчи. АУДИТОРИЯ: [неразборчиво]. Кевин ШМИД: Он должен сделано довольно скоро. Так оно и должно принять 5:55 секунд. Я не знаю, это только V8 быть супер быстро, но в любом случае, это очень короткий пример, и нарочно безвкусный из нетривиальная вычисление. Так через некоторое время, это действительно становится это. Но теперь, что если я это сделаю такой же Эксперимент, как и прежде, где я делаю два запроса в то же время? Так вот я иду на Curl на что адрес, и я собираюсь сделать еще Curl. И помните, когда мы сделали это для спать сервер, когда мы в основном должны были его через пять секунд, они в значительной много и вернулся право примерно в то же время. Так что это не было особенно связали. Но давайте попробуем это сейчас. Итак, мы получили наши два процесса. Помните это те идентификаторы процессов. Это будет немного неудобно в то время как мы стойло. Так что давайте просто остаться здесь и ждать. Так один из них должен прийти назад после как - Итак, один вернулся. Но тогда почему не второй один вернуться только пока? Да? АУДИТОРИЯ: Сервер не может ничего сделать пока она вычисления, что большое число. Кевин ШМИД: Верно. Таким образом, ответ был просто, что сервер действительно ничего не может сделать в то время как это вычисления, что число Фибоначчи. Так что теперь я только что получил мои две вещи обратно. Но я думаю, просто думать о коде немного больше, как это работает и все. Так эта функция здесь код, который Я сказал этот сервер для запуска, когда она получает новый входящий запрос. Так что это просто собирается запустить через это весь код, а затем он собирается пойти назад в цикл обработки событий, а затем продолжить проверки новых событий. Поэтому в основном то, что мы происходит является сервер прислушиваясь к новым вещам. Первый человек просит за то, что 45 есть. Мы проводим этот код, чтобы вычислить его. Этот код берет примерно пять до шести секунд для запуска. Тогда мы идем обратно в цикл событий и проверять наличие новых запросов. Таким образом, это пример того, как, если есть вещи, которые так называемый вычислительный связан, или использовать много вычислительных, не власть, но, как и в вычислений - Я думаю, одна вещь, чтобы сказать об этом является что эта функция делает полностью, по большей части, довольно полезная работа правой. Все время, что, что обратного вызова Функция бежал, это было довольно много тратить большую часть своего времени просто вычисления число, п Фибоначчи. Но у нас был только один поток иметь дело с. В модели Apache, когда два человека сделал запрос, чтобы получить Фибо 45, мы было бы два разных темы. А потом работа операционной системы было бы, или уровень пользователя код, который управляет темы, будет уже в том, чтобы нарезать, что на Процессор, или даже если у вас несколько процессоров, распределить их равномерно по всей процессоров так, чтобы они оба были отделка примерно в то же время. Так что просто показать вам, как мы можем сортировать из - и это не является полным совершенным решение, но своего рода, как мы можем сделать вернуться сюда и сделать немного лучше. Так что у меня здесь является программа под названием Фибо С. И это в основном использует еще один из модулей узла называется Модуль по уходу за детьми Процесс. Так я включил, что в верхнем рода вроде я сделал бы фунт включают ребенок process.h или что-то. Теперь у меня есть доступ к этой переменной СР который имеет всю функциональность. Так что теперь, что я делаю в этом ответе обработчик я бегу эту программу точка слэш выдумка 45. Так что я сделал - и я просто хочу, выйти из этой программы для немного - является Я написал программу на С, что в основном вычисляет энного количества Фибоначчи. Так вот просто программа, что я написал в С, которая вычисляет это. Я могу скомпилировать его, и я могу работать это в командной строке. И это будет вычислить Число 45-е Фибоначчи. Так заметите, что он просто берет в значительной степени как долго. Я, вероятно, могли бы использовать тире 03 к оптимизировать его или что-то вроде этого, но я просто сделал, как обычная настройки компилятора. И это печатает его. Но теперь, что я вроде делаешь? Эх жаль, так файл. Так что я тот же самый материал с заголовок, как раньше. Тогда я делаю это cp.exec. Так что это будет сделать, это он собирается запустить эту программу. Но то, как это работает в том, что он не собирается ждать что программа до конца. Это просто в основном говорит выполнить эту программу. Поэтому в основном наберите в командной строки рода. А потом, когда вы закончите с это, запустить эту функцию. Так что теперь мы как-то получить Весь восстановлен вещь как мы не ждем. Такая ли смысл? Да? АУДИТОРИЯ: [неразборчиво]? Кевин ШМИД: Так что это будет на самом деле открыть новый процесс, чтобы сделать это. Так что это на самом деле, в некотором смысле, зло, не супер зла, но это Важно сказать, что это своего рода возвращаясь к, с одной стороны, Apache модель, где мы делаем потоков и процессов для каждого запроса или процессы для каждого запроса. Так что это своего рода аналогичны к тому, что Apache делает. В некоторых случаях, это будет просто использовать новый нить, которая немного больше света вес, чем процесс, но Apache мог в конечном итоге порождения нового процесса которая является своеобразной, что мы делаем здесь неявно, делая точечный косой выдумка 45. И то в этом случае, мы как бы на себя одни и те же расходы процессов. Так что это только одна вещь, вы можете сделать. Но только, чтобы показать этот вид бега. И эти разговоры просто действительно направлены на представляя такого рода программ, как способ показать различные точки зрения на как проектировать серверы, как это. Так что это работает, и то сейчас, если я делаю это снова, я получил два идентификаторы процессов. Давайте просто говорить о вещи, чтобы отметить. Так заметить, что они постепенно. Это круто. Потому что это было 27 122 раньше. Но обратите внимание сейчас, они вернулись примерно в то же самое время. А теперь, хороший вопрос, чтобы спросить о почему, что дело, в чьи обязанности был его сейчас, чтобы своего рода делают эти вещи вид играть честно друг с другие, эти два экземпляра точка слэш выдумка 45, что я побежал или что узел побежал? Кто рода делает его справедливым, что они оба получить вид сбалансированы время работы? АУДИТОРИЯ: [неразборчиво]. Кевин ШМИД: Да. Так в основном, когда я делаю точка слэш выдумка 45 или что-то вроде этого, теперь это рода до операционной системы обрабатывать выполнения этих программ. И теперь он может планировать их на разных процессорах или его может планировать их. Он может нарезать время, что один Процессор получает его или что они получают для работы на одном процессоре. Так вот идея, что. Имеет ли это смысл всем? Так что теперь узел на самом деле не играет участие в дележа этих задач. ОК. Так вот почти это примеры. Я просто хотел показать еще одну вещь потому что многое из этого до сих пор не полностью супер практических в некоторых случаях. Я могу себе представить, чтобы приходить домой после этого говорить и что-то и говорил, как, ну я как бы получил из этого разговора, что Я могу сделать сервер Фибоначчи для мой окончательный проект. Итак, вот только вид еще один пример что мы надеемся, будет - может быть, нет, но, может быть, - немного больше рода отношение к окончательных проектов и позаботиться об этом заранее такие вещи, как, что. Так что это chat.js. Так что это вроде как некоторый образец Серверная часть кода, который можно использовать, чтобы создать небольшую чат сервер, как Вы, возможно, видели на Facebook Чат или любой другой. Так что я не говорю, что это, как Facebook Чат, но это своего рода как хороший - может быть, не очень хорошо, но, возможно, хорошо - отправной точкой для беседы сервер для вашего сайта для окончательного проекта. Итак, давайте взглянем на то, что он делает. Так мы получаем эту специальную вещь в верхней части, эта переменная SIO равно требуют Socket.IO. Так что это другое дело, что это не так на самом деле приходят в комплекте с Узел но вы можете установить его. Это модуль Node. Так что это просто, как некоторые расширение Node. SocketIO на самом деле очень круто. Это абстракция, которая в основном то, что он есть это позволяет есть этот поток коммуникации между паутиной браузер и веб-сервер. Так по большей части до сих пор, у нас были это очень быстро за одну секунду или две второй связи между веб браузер и веб-сервер. Так что это в основном идут на google.com, Get материал, отправить его обратно, а затем мы закончили. Мы никогда не говорим снова, пока пользователь вводит в чем-то другом. Но то, что Socket.IO и подобного рода вещи - и SocketIO на самом деле одна из вещей, которая построена на качестве WebSocket который является своего рода доступны как часть HTML5 - что позволяет иметь это продолжение диалога. И это очень полезно в чат-сервера Такие вещи, потому что это вроде как продолжение диалога в некоторые способы, потому что, если вы в чате с кем-то, теперь вы можете просто отправить сообщение вниз по трубе, а затем сервер может отправить сообщение вниз трубы к другому человеку вы находитесь чате с. И тогда вы можете иметь это обмениваться так. Так что вроде того, что SocketIO хорош для. Причина, по которой SocketIO использует WebSockets как одно, что в дополнение к просто старых WebSockets, это также делает некоторые трюки, чтобы в основном сделать его браузер, совместимый. Так браузеры, такие как Internet Explorer к сожалению, не поддерживает WebSockets прямо из коробки. Так он использует некоторый другой вид круто аккуратно вещи с Adobe Flash, чтобы позволить вам иметь поддержку кросс-браузера. Так что это действительно полезно. А на самом деле, я знаю, я отчасти работает на время здесь, но CS50 Обсудить, вы когда-нибудь видели что-то как, я не знаю,, пустой, поэтому и так отвечая на этот пост или что-то так, что функция? Это SocketIO. Поэтому, когда кто-то начинает печатать в обсудить окно, чтобы сделать ответ или что-то, ваш браузер что называется в SocketIO излучает какую-то событие, которое говорит чей-то отвечая на этот пост. Затем сервер говорит, хорошо, что я должен делать? Ну теперь я должен сказать этим с другими парнями кто на CS50 Обсудить глядя на этом посту, что кто-то ответить. Так что вроде того, что SocketIO является хорошо для, этой продолжающейся вида поток диалога. ОК. Так что у меня есть здесь - и мы просто собирается игнорировать массив соединений для немного - что я делаю, я другой слушать. Так вот именно так, как в Socket.IO будет говоря давайте послушаем на этот порт. А потом я делаю это на связи. Так вот просто в основном гнездо МО способ сказать, когда мы получим соединение, я хочу, чтобы вы чтобы запустить этот код. И заметьте, что вместо того, REC и разрешением прошли там у меня есть гнезда. И это гнездо идея заключается в основном это , что вы можете написать и прочитать от которого есть пользователя Сообщения возможно. И сообщения, которые вы бы послать может пройти через это Socket. Имеет ли это смысл? Так что это, это продолжающееся вещь. Так что я делаю, это я называю Socket.emit. И излучают занимает довольно много два аргумента. Первый аргумент является строкой просто, представляющий тип вещь вы излучающих. Так для этого случая, у меня использование эта строка нового сообщения. И это только в основном говорят, что тип этой вещи, то, что я отправки, является новое сообщение. Таким образом, вы можете слушать для конкретных типов как новое сообщение или что с помощью точку на. Так соединение и пользователь отправил туда, если вы посмотрите на то, где мы называем точка на, те, и другие строки, представляющие типы сообщений пользователей. Так что это в основном вы можете иметь эту Emit один из этих типов сообщений, и затем сделать что-то в ответ на один из этих типов сообщений Так что я излучающих эту новое сообщение. Мы собираемся игнорировать connections.push ни на секунду. Но тогда я говорю, пользователь Socket.on отправлено. Так что теперь это вроде как, когда Пользователь посылает мне сообщение, я хочу запускать этот код. И заметьте, что, что анонимная функция принимает в этой переменной называется данные, которые в основном идут иметь сообщение пользователя. А теперь давайте рода разговоры о массив соединения. Так что это рассчитано на чат-клиент , где в основном все вроде в то же самое в чат. Так в основном, то, что мы должны держать вокруг некоторых массив, который в основном представляет все людей, болтающих в некоторые способы, если это имеет смысл. Не так ли? Потому что мы должны знать, кто эти ребята так мы можем послать им сообщения что другие люди пришли к нам. Так что делает этот код, когда пользователь посылает сообщение - вот тип событие - мы собираемся запустить этот код. И то, что мы делаем, мы будем проходить через это Массив, мы назвали соединения. И в значительной степени для каждого соединения за исключением одного, это наше, это , что говорит этот код, мы отправляем новый сообщение с таким прилагается сообщения информация. Так что, если вы заметили, здесь, что я сделал, когда пользователь действительно делает новый соединение я добавил с Метод JavaScript.push, это в основном просто говорю, как добавить что гнездо в качестве значения в наша соединения массив. Так что теперь при выполнении этого кода, он будет отправить вещи для тех, частности соединения. Так что это может быть хорошей отправной точкой для создания чат-сервера или что-то подобное. И вид здорово то, что код, который вы видите здесь, как на и излучают и все в таком духе то же самое вид кода JavaScript, которые вы бы написать в браузере взаимодействовать с сервером. Так вот почему SocketIO отчасти аккуратно и полезно таким образом. Ох, и еще одна вещь, очень быстро. Был последний проект CS50 в прошлом году , что в основном реализуется поболтать сервер в Node.js. Я думаю, что это Harvardchats.org но я не - ОК. Я не уверен, что URL является, но Я могу послать, что впоследствии. Но это круто, что вы можете сделать с Node.js. Так что я надеюсь, в общем, вы, ребята, хорошее чувство, что Node.js полезно и как вы могли бы, может быть, применить до конечного проекта. Я буду посылать еще немного ресурсы согласиться с этим. И спасибо, что пришли. Спасибо. [Аплодисменты]