大吉大利,今晚吃雞!
- PUBG
時(shí)隔多日,終于再次拾起這個(gè)拖了很久的項(xiàng)目。并不是因?yàn)闆](méi)時(shí)間,也不是因?yàn)檫@個(gè)項(xiàng)目對(duì)于我來(lái)說(shuō)有多困難,就是一個(gè)字————懶。
此項(xiàng)目的后臺(tái),當(dāng)然是選擇node.js來(lái)實(shí)現(xiàn)。作為一個(gè)前端,node.js比起java、php簡(jiǎn)單多了。
在npm中有很多支持webSocket的模塊,包括socket.io、node-websocket、faye-websocket-node等等,都可以實(shí)現(xiàn)webSocket,但是能查到的資料最多的應(yīng)該算是socket.io了。
可參考粉絲日志里面對(duì)每種模塊的實(shí)現(xiàn):http://blog.fens.me/nodejs-we...
本項(xiàng)目選用的當(dāng)然是socket.io 資料多,易上手。
socket.io socket.io 安裝npm install socket.io --save
安裝在項(xiàng)目?jī)?nèi),并且保存在你的package.json中。
如何使用使用socket.io非常簡(jiǎn)單,只需如下兩個(gè)文件
index.js
var app = require("http").createServer(handler) // 使用了node自帶的http模塊 var io = require("socket.io")(app); var fs = require("fs"); // node自帶的fs模塊 app.listen(3000); // 監(jiān)聽(tīng)3000端口 // 定義一個(gè)處理器,當(dāng)訪(fǎng)問(wèn)localhost:3000時(shí),執(zhí)行此函數(shù),返回index.html文件 function handler (req, res) { fs.readFile(__dirname + "/index.html", function (err, data) { if (err) { res.writeHead(500); return res.end("Error loading index.html"); } res.writeHead(200); res.end(data); }); } // 監(jiān)聽(tīng)socket連接 io.on("connection", function (socket) { //向web端推送消息 socket.emit("news", { hello: "world" }); //接收web端傳遞的消息 socket.on("my other event", function (data) { console.log(data); }); });
index.html
若想結(jié)合express或Koa框架使用,請(qǐng)參閱socket.io文檔https://socket.io/docs/ 中文版: https://zhuanlan.zhihu.com/p/...
API下面介紹一些socket.io常用的API,可分為服務(wù)端和客戶(hù)端兩部分
1.構(gòu)造函數(shù) Server
實(shí)例化一個(gè)socket.io對(duì)象,有兩種寫(xiě)法:
const io = require("socket.io")(); // or const Server = require("socket.io"); const io = new Server();
接收兩個(gè)參數(shù)(httpServer,options)【需要綁定的服務(wù)器,配置項(xiàng)】,第一個(gè)例子中的var app = require("http").createServer(handler) 就是一個(gè)服務(wù)器。
2.connect和connection事件
io.on("connect", (socket) => { // ... }); io.on("connection", (socket) => { // ... });
當(dāng)有一個(gè)來(lái)自客戶(hù)端的連接時(shí)觸發(fā)該事件,參數(shù)socket為連接的客戶(hù)端的socket對(duì)象。
3.socket
上面提到的socket可看做一個(gè)和下行客戶(hù)端溝通的橋梁。他屬于一個(gè)特定的命名空間(默認(rèn)為"/")。
socket.id: 一個(gè)獨(dú)一無(wú)二的會(huì)話(huà)標(biāo)志,來(lái)自與下行客戶(hù)端,在發(fā)送消息給指定的客戶(hù)端的時(shí)候非常有用
//發(fā)送給指定的客戶(hù)端 io.sockets.connected[socket.id].emit("err","user is exist");
socket.rooms: 遺傳哈希字符串,用來(lái)標(biāo)志當(dāng)前客戶(hù)端所在的房間號(hào),通過(guò)房間名稱(chēng)建立索引。有了房間機(jī)制就可實(shí)現(xiàn)給同一組房間內(nèi)的socket推送消息,(可用來(lái)實(shí)現(xiàn)群聊)
io.on("connection", (socket) => { socket.join("room 237", () => { let rooms = Objects.keys(socket.rooms); console.log(rooms); // [, "room 237" ] }); });
socket.use:注冊(cè)中間件,當(dāng)任何訊息流經(jīng)該中間件時(shí)執(zhí)行中間件中的內(nèi)容,該中間件會(huì)接受參數(shù),也可以判斷是否阻斷后續(xù)中間件的執(zhí)行
io.on("connection", (socket) => { socket.use((packet, next) => { if (packet.doge === true) return next(); next(new Error("Not a doge error")); }); });
socket.send: 發(fā)送一個(gè)message事件,接收要發(fā)送的內(nèi)容和回調(diào)函數(shù)為參數(shù)
socket.send("hi", function(data) { console.log(data); }); // 客戶(hù)端 socket.on("message", function(data) { console.log(data); })
socket.emit: 重寫(xiě)/強(qiáng)化 EventEmitter.emit方法,通過(guò)事件名來(lái)觸發(fā)事件給指定的socket,任意多的參數(shù)都可被傳入,支持所有可序列化的數(shù)據(jù)結(jié)構(gòu)。
接收一下參數(shù):
eventName (字符串) args 所以可序列化的數(shù)據(jù)結(jié)構(gòu) 包括buffer ack (Function)
// 簡(jiǎn)單的例子 socket.emit("print", "hello world"); socket.emit("ferret", "tobi", (data) => { console.log(data); // data will be "woot" });
socket.on: 為給定的事件注冊(cè)一個(gè)新的事件處理器。
socket.on("news", (data) => { console.log(data); }); // with several arguments socket.on("news", (arg1, arg2, arg3) => { // ... }); // or with acknowledgement socket.on("news", (data, callback) => { callback(0); });
socket.join: 添加客戶(hù)端到room房間內(nèi),并且執(zhí)行可選擇的回調(diào)函數(shù)。
io.on("connection", (socket) => { socket.join("room 237", () => { let rooms = Objects.keys(socket.rooms); console.log(rooms); // [, "room 237" ] io.to("room 237", "a new user has joined the room"); // broadcast to everyone in the room }); });
socket.leave:從指定的房間里移除客戶(hù)端,并且可選擇的執(zhí)行一個(gè)異常回調(diào)函數(shù),與當(dāng)客戶(hù)端的連接丟失后,會(huì)自動(dòng)的將其從房間移除
socket.leave("room 237",(res)=>{ console.log(res) })
socket.io中的namespace和room,可參考文章:http://blog.csdn.net/lijiecon...
以上就是常用的服務(wù)API,下面介紹客戶(hù)端的socket.io
IO: 創(chuàng)建socket連接,還可指定命名空間
io("http://localhost/users"); // 則將會(huì)對(duì)http://localhost進(jìn)行傳輸連接,并且http://Socket.IO連接將會(huì)對(duì)"/users"建立連接。
也可提供查詢(xún)參數(shù):
io("http://localhost/users?token=abc")
還可以使用多路復(fù)用、攜帶額外的請(qǐng)求頭
詳細(xì)文檔可參考: https://socket.io/docs/client...
connect: 監(jiān)聽(tīng)是否與服務(wù)器連接成功,接收回調(diào)函數(shù)
const socket = io("http://localhost"); socket.on("connect", () => { console.log("conncet ok"); });
connect_error:接錯(cuò)誤觸發(fā)事件處理器
socket.on("connect_error", (error) => { // ... });
disconnect:丟失連接時(shí)觸發(fā)時(shí)間處理器
socket.on("disconnect", (timeout) => { // ... });
reconnect: 成功的重連時(shí)觸發(fā)時(shí)間處理器
socket.on("reconnect", (timeout) => { // ... });
Sokect
也是一個(gè)連接服務(wù)端的對(duì)象,在連接到服務(wù)器之后也會(huì)生成與服務(wù)端socket相同的id
const socket = io("http://localhost"); console.log(socket.id); // undefined socket.on("connect", () => { console.log(socket.id); // "G5p5..." });
socket.open()和socket.connect(): 手動(dòng)打開(kāi)socket,可用于在連接斷開(kāi)后重新連接
socket.on("disconnect", () => { socket.open(); });
socket.emit: 向服務(wù)端發(fā)送,與服務(wù)端的emit用法相同
socket.emit("ferret", "tobi", (data) => { console.log(data); // data will be "woot" });
socket.on:注冊(cè)一個(gè)新的響應(yīng)服務(wù)器事件的事件處理器,與服務(wù)端的用法相同
socket.on("news", (data) => { console.log(data); });
socket.close()和socket.disconnect(): 手動(dòng)關(guān)閉客戶(hù)端對(duì)服務(wù)器的鏈接
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/91763.html
摘要:先看看兼容性創(chuàng)建連接構(gòu)造函數(shù)接收兩個(gè)參數(shù)這里的不能是或者而是對(duì)應(yīng)的或者和是定義的兩種方案,類(lèi)似于類(lèi)似于協(xié)議名稱(chēng),是可選的。服務(wù)端和客戶(hù)端的協(xié)議名稱(chēng)必須一致。協(xié)議有三種注冊(cè)協(xié)議,開(kāi)放協(xié)議,自定義協(xié)議。限制以?xún)?nèi)就是在構(gòu)造函數(shù)中選傳的參數(shù)。 愿天下所有的情侶,都是失散多年的兄妹 ——好妹妹webScoket是html5提出的一個(gè)協(xié)議,咱們用的http是無(wú)狀態(tài)...
摘要:為安裝文件,無(wú)需再配置環(huán)境變量。連接操作有以下包作者并未查到除此之外的包,但不代表沒(méi)有。等于是每個(gè)默認(rèn)配置的主鍵屬性,屬性名為可自己定義一個(gè)來(lái)覆蓋此屬性。需要注意的是,在新版本的文檔中,為。通過(guò)創(chuàng)建限于篇幅,本小節(jié)暫時(shí)寫(xiě)到這里。 我的琴聲嗚咽,我的淚水全無(wú)。我把遠(yuǎn)方的遠(yuǎn)歸還草原。 - 海子《九月》 mongodb安裝 什么是Mongodb?就是一個(gè)基...
摘要:最終獲得一個(gè)鏈接,里面有這樣的描述如何在阿里云負(fù)載均衡上啟用支持無(wú)需配置,當(dāng)選用監(jiān)聽(tīng)時(shí),默認(rèn)支持無(wú)加密版本協(xié)議協(xié)議當(dāng)選擇監(jiān)聽(tīng)時(shí),默認(rèn)支持加密版本的協(xié)議協(xié)議。詳細(xì)參見(jiàn)如何使用負(fù)載均衡性能保障型實(shí)例。 Websocket是HTML5之后的一個(gè)新事物,可以方便的實(shí)現(xiàn)客戶(hù)端到服務(wù)端的長(zhǎng)會(huì)話(huà),特別適合用于客戶(hù)端需要接收服務(wù)端推送的場(chǎng)景。例如在線(xiàn)客服聊天,提醒推送等等。改變了以往客戶(hù)端只能通過(guò)輪詢(xún)...
摘要:主要表現(xiàn)在復(fù)雜的語(yǔ)句事務(wù)支持等。僅支持,在等瀏覽器中,會(huì)出現(xiàn)樣式布局混亂的情況。將群群對(duì)應(yīng)的聊天記錄保存在數(shù)據(jù)庫(kù)。用戶(hù)進(jìn)入群聊,則將其加入到對(duì)應(yīng)的中。文件大小不能超過(guò)通過(guò)模塊操作登錄注冊(cè)將用戶(hù)名作為唯一值。登錄支持自動(dòng)登錄,將密碼保存在中。 showImg(https://segmentfault.com/img/bV4jYr?w=402&h=710);showImg(https://...
閱讀 2875·2019-08-30 15:44
閱讀 1901·2019-08-29 13:59
閱讀 2848·2019-08-29 12:29
閱讀 1096·2019-08-26 13:57
閱讀 3207·2019-08-26 13:45
閱讀 3339·2019-08-26 10:28
閱讀 842·2019-08-26 10:18
閱讀 1698·2019-08-23 16:52