先扯淡一下,試想一下,如果有一天公司把私人QQ,微信禁了,這個時候你如何與外界聯系??
那么牛逼的我們可以自己搭一個聊天室,以下是聊天室搭建全過程,參照的資料如下:
《node.js權威指南》
http://nqdeng.github.io/7-days-nodejs/ 七天學會node.js
http://www.runoob.com/nodejs/nodejs-tutorial.html node.js菜鳥教程
http://www.open-open.com/lib/view/open1402479198587.html socket.io模塊在客戶端和服務端的應用
http://cnodejs.org/ node學習的社區
http://www.cnblogs.com/GumpYan/p/5821193.html http 長連接原理
http://blog.csdn.net/csdnhaoren13/article/details/51034565 Socket.io簡介
以下展示以win7 64位為例。
Node安裝與配置
不喜歡翻墻的下載鏈接如下,版本肯定不是最新的:
http://nodejs.cn/download/
翻墻的下載鏈接
https://nodejs.org/en/
安裝過程中需要注意,紅框中表示將node命令加入到系統環境,注意檢查勾選。
安裝完畢后,先在cmd中檢測是否安裝完成,出現版本信息代表安裝完成。
之后需要使用npm進行node模塊安裝,國內速度不行,使用cnpm加速npm,目前cnpm同步時間間隔為15分鐘 ,
建議用國內鏡像,更換命令如下:
$ npm --registry http://registry.npm.taobao.org info underscore
建立Node第一個應用
先確定當前開發目錄為 E:\node_test
下面將用cwd指代 E:\node_test
*** Step1 ***
項目初始化,定義產品信息(版本號,作者,描述等),執行命令如下
$ npm init
這樣就在工作目錄下生成了package.json
*** Step2 ***
安裝常用模塊
第一步的package.json顯得很有用了,打開它發現
{ "name": "learning_node", "version": "1.0.0", "description": "app", "main": "http.js", "scripts": { "test": "console,log" }, "keywords": [ "app" ], "author": "Wzq", "license": "ISC", "devDependencies": { "argv": "0.0.2", "express": "^4.14.0" }, "dependencies": { "ejs": "^2.5.5" } }
上圖包含了項目名,版本,描述,項目入口,關鍵詞,作者等信息
我們在命令行執行
$ npm i http
發現package.json沒有變化,但cwd/node_modules中已經多了http模塊了
繼續執行
$ npm i http -save
發現package.json中加了 dependencies,這個指的是產品模式
繼續執行
$ npm i http --save-dev
發現package.json中加了 devDependencies,這個指的是開發模式
在第一個應用創建成功后,該package.json可以用于第二個應用,直接執行npm install會自動搜索并安裝package.json中devDependencies的條目
*** Step3 ***
創建服務器
在cwd下創建http.js,寫入內容:
var http = require( 'http' );//引入http模塊 http.createServer(function (request, response) {//開始監聽服務器 // 發送 HTTP 頭部 // HTTP 狀態值: 200 : OK // 內容類型: text/html var params = url.parse( request.url, true ).query;//取出請求地址的參數部分 console.log(request.url); response.writeHead(200, { 'Content-Type': 'text/html; charset=utf8' }); response.write( "ok" );//返回響應值 response.end();//關閉tcp連接 }).listen( 8888, '127.0.0.1' );//監聽本地8888端口
// 終端打印如下信息
console.log('Server running at http://127.0.0.1:8888/');
在cwd下執行
$ node http
打開瀏覽器,輸入127.0.0.1:8888
如果出現端口被占領的情況,請查詢端口使用情況
$ netstat -ano
通過pid找到對應進程,選擇性關閉。
---到這里,第一個服務器已經搭建完成---
Socket.io初涉獵
首先先了解一下socket.io是什么。
在html5的websocket出現之前,如果要實現瀏覽器和服務器的實時通信,大家是這么做的:
1)HTTP 1.1 中 默認 keep-connection: alive,也就是使一次 TCP 連接中完成多個 HTTP 請求,但是對每個請求仍然要單獨發 header,簡單來說
網頁中的多個圖片請求依然是發多個http請求,但是共用TCP連接,然后通過不斷向服務器請求是否有新的數據來達到實時通信(輪詢polling)
參考資料:http://www.cnblogs.com/GumpYan/p/5821193.html
2)Adobe flash socket (這個還未了解)
WebSocket本質上就是一個TCP連接,它解決的第一個問題是,通過第一個 HTTP request 建立了 TCP 連接之后,之后的交換數據都不需要再發 HTTP request了,達到真正意義上的長連接
下圖是Websocket在各個終端不同版本的兼容性:
為了方便初學者開發,前人已經幫我們解決好了兼容性的問題,于是偉大的Socket.io誕生
Socket.io解決了三件大事情:
1)封裝Websocket協議,強大的api,操作更方便
2)支持多種輪詢方式,萬一瀏覽器不支持Websocket,那么有多種方式可以實現實時通信
3)統一了客戶端和服務端的api,前后端只需要用一套api,方便開發
參考:http://blog.csdn.net/csdnhaoren13/article/details/51034565
---到這里,socket.io的簡介就結束了---
建立第一個簡單的Socket應用
在這一節中,為了方便后續功能的擴展,我將用新的方法來創建服務器
首先是溫習一下npm install,這一節中需要5個模塊
$ npm i fs --save-dev #文件處理模塊 $ npm i socket --save-dev #socket.io模塊 $ npm i express --save-dev #node.js框架 $ npm i path--save-dev #路徑處理模塊 $ npm i http --save-dev #http模塊
服務端代碼,用于監聽127.0.0.1:8888的請求
//[模塊引入] //接觸過grunt的同學會比較熟悉require,返回值是modules.export外爆出來的內容 var fs = require('fs'); var express = require('express'); var http = require('http'); var io = require('socket.io'); var path = require('path'); // [http托管] //http監聽8888端口,再交由socket.io管理 server = express(); http = http.Server(server).listen(8888); io = io(http); //[路由設置] server.get('/', function(req, res) { var data = fs.readFileSync('./index.html'); res.writeHead(200, { 'Content-type': "text/html" }); res.write(data); res.end(); }); //[socket.io配置] var names = [];// 全部已登錄用戶 io.on('connection', function(socket) { names.push(socket.client.id);// 每個登錄的用戶由socket隨機生成id io.sockets.emit('login',names);// 每當有用戶登錄,guangbo });
客戶端代碼
<!DOCTYPE html>
<html>
<head> <meta charset="utf-8"> <title>自定義聊天室</title> </head>
<body> <section class="body" id="step2"> <div class="title-bar"> <span>socket聊天室</span> <div class="log-reg"> <div class="log"> <input type="button" id="quit" value="登出" /> 當前用戶:<br/> <output id="curUser"></output> <br/> </div> </div> </div> </section> <script src="http://libs.baidu.com/jquery/1.9.1/jquery.min.js"></script> <script src="http://localhost:8888/socket.io/socket.io.js"></script> <script> var socket = io.connect(); socket.on('login', function(names) { var str = ''; names.forEach(function(item, index) { str += item + '<br/>'; }) $("#curUser").html(str); }) </script> </body>
</html>
在多個瀏覽器打開localhost:8888,效果如下:
---到這里,第一個socket應用講解已經結束了---
** 下一節將介紹如何實現實時聊天 **