加載 http 核心模塊
var http = require('http')
創建Web服務器
使用
http.createServer()
方法創建一個 Web 服務器// 返回一個 Server 實例 var server = http.createServer()
服務器得幹嘛
- 提供服務:對 數據的服務
- 發請求
- 接收請求
- 處理請求
- 給個反饋(發送響應)
- 註冊 request 請求事件(
request 請求事件處理函數,需要接收兩個參數:
)
- Request 請求對象(
請求對象可以用來獲取客戶端的一些請求信息,例如請求路徑
)- Response 響應對象(
響應對象可以用來給客戶端發送響應消息
)- 當客戶端請求過來,就會自動觸發服務器的 request 請求事件,然後執行第二個參數:回調處理函數
server.on('request', function (request, response) { console.log('收到客戶端的請求了,路徑是:'request.url) // response 對象有一個方法:end 可以用來結束本次會話 // 同時在end中進行傳遞數據響應客戶端,一定要使用 end 來結束響應,否則客戶端會一直等待 response.end("hello nodejsAre you ok?") })
啓動服務器
綁定端口號,啓動服務器
// 綁定端口號3000 server.listen(3000, function () { console.log('服務器啓動成功了,可以通過 http://127.0.0.1:3000/ 來進行訪問') })
客戶端
服務器響應
結合上述的內容,搭建一個服務器,根據不同的路徑,響應不同的結果
- ip 地址用來定位計算機,端口號用來定位具體的應用程序
- 所有需要聯網通信的應用程序都會佔用一個端口號
- 端口號的範圍從
- 計算機中的一些默認端口號,最好不要使用,防止端口衝突
var http = require('http') // 1. 創建 Server var server = http.createServer() // 2. 監聽 request 請求事件,設置請求處理函數 server.on('request', function (req, res) { console.log('收到請求了,請求路徑是:' + req.url) console.log('請求我的客戶端的地址是:', req.socket.remoteAddress, req.socket.remotePort) // req.socket.remotePort 客戶機請求的端口號 // req.socket.remoteAddress 客戶機請求的IP地址 var url = req.url if (url === '/') { res.end('index page') } else if (url === '/login') { res.end('login page') } else if (url === '/products') { var products = [{ name: '蘋果 X', price: 8888 }, { name: '菠蘿 X', price: 5000 }, { name: '小辣椒 X', price: 1999 } ] // 響應內容只能是二進制數據或者字符串 // 數字 // 對象 // 數組 // 布爾值 res.end(JSON.stringify(products)) } else { res.end('404 Not Found.') } }) // 3. 綁定端口號,啓動服務 server.listen(3000, function () { console.log('服務器啓動成功,可以訪問了。。。') })
編碼設置
- 在服務端默認發送的數據,其實是 utf8 編碼的內容
- 但是瀏覽器不知道你是
utf8
編碼的內容- 瀏覽器在不知道服務器響應內容的編碼的情況下會按照當前操作系統的默認編碼去解析
- 而中文操作系統默認是
gbk
解決亂碼
在 http 協議中,
Content-Type
就是用來告知對方我給你發送的數據內容是什麼類型server.on('request', function (req, res) { console.log('請求了') var url = req.url if (url === '/plain') { // text/plain 就是普通文本 res.setHeader('Content-Type', 'text/plain; charset=utf-8') res.end('hello 世界') } else if (url === '/html') { // 如果你發送的是 html 格式的字符串,則也要告訴瀏覽器我給你發送是 text/html 格式的內容 res.setHeader('Content-Type', 'text/html; charset=utf-8') res.end('<p>hello html <a href="">點我</a></p>') } })
完整的服務器
一般需要返回一個頁面的情況,則需要更加方便的方法來進行
var http = require('http') var fs = require('fs') var server = http.createServer() server.on('request', function (req, res) { // / index.html var url = req.url if (url === '/') { // 我們要發送的還是在文件中的內容 fs.readFile('./resource/index.html', function (err, data) { if (err) { res.setHeader('Content-Type', 'text/plain; charset=utf-8') res.end('文件讀取失敗,請稍後重試!') } else { // data 默認是二進制數據,可以通過 .toString 轉爲咱們能識別的字符串 // res.end() 支持兩種數據類型,一種是二進制,一種是字符串 res.setHeader('Content-Type', 'text/html; charset=utf-8') res.end(data) } }) } else if (url === '/xiaoming') { fs.readFile('./resource/ab2.jpg', function (err, data) { if (err) { res.setHeader('Content-Type', 'text/plain; charset=utf-8') res.end('文件讀取失敗,請稍後重試!') } else { res.setHeader('Content-Type', 'image/jpeg') res.end(data) } }) } }) server.listen(3000, function () { console.log('Server is running...') })
- 結合 fs 發送文件中的數據
- Content-Type
- 對照表
- 不同的資源對應的 Content-Type 是不一樣的
- 圖片不需要指定編碼,一般只爲字符數據才指定編碼