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