成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

vue2.0開發(fā)聊天程序(六) 服務端的webScoket

hiyayiji / 3696人閱讀

大吉大利,今晚吃雞!
                   - PUBG

時隔多日,終于再次拾起這個拖了很久的項目。并不是因為沒時間,也不是因為這個項目對于我來說有多困難,就是一個字————懶。
此項目的后臺,當然是選擇node.js來實現(xiàn)。作為一個前端,node.js比起java、php簡單多了。

node支持的webSocket

在npm中有很多支持webSocket的模塊,包括socket.io、node-websocket、faye-websocket-node等等,都可以實現(xiàn)webSocket,但是能查到的資料最多的應該算是socket.io了。
可參考粉絲日志里面對每種模塊的實現(xiàn):http://blog.fens.me/nodejs-we...

本項目選用的當然是socket.io 資料多,易上手。

socket.io socket.io 安裝
npm install socket.io --save

安裝在項目內(nèi),并且保存在你的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); // 監(jiān)聽3000端口

// 定義一個處理器,當訪問localhost:3000時,執(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)聽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框架使用,請參閱socket.io文檔https://socket.io/docs/ 中文版: https://zhuanlan.zhihu.com/p/...

API

下面介紹一些socket.io常用的API,可分為服務端和客戶端兩部分

服務端

1.構(gòu)造函數(shù) Server

實例化一個socket.io對象,有兩種寫法:

const io = require("socket.io")();
// or
const Server = require("socket.io");
const io = new Server();

接收兩個參數(shù)(httpServer,options)【需要綁定的服務器,配置項】,第一個例子中的var app = require("http").createServer(handler) 就是一個服務器。

2.connect和connection事件

io.on("connect", (socket) => {
  // ...
});
io.on("connection", (socket) => {
  // ...
});

當有一個來自客戶端的連接時觸發(fā)該事件,參數(shù)socket為連接的客戶端的socket對象。

3.socket
上面提到的socket可看做一個和下行客戶端溝通的橋梁。他屬于一個特定的命名空間(默認為"/")。

socket.id: 一個獨一無二的會話標志,來自與下行客戶端,在發(fā)送消息給指定的客戶端的時候非常有用

//發(fā)送給指定的客戶端
    io.sockets.connected[socket.id].emit("err","user is exist");

socket.rooms: 遺傳哈希字符串,用來標志當前客戶端所在的房間號,通過房間名稱建立索引。有了房間機制就可實現(xiàn)給同一組房間內(nèi)的socket推送消息,(可用來實現(xiàn)群聊)

io.on("connection", (socket) => {
  socket.join("room 237", () => {
    let rooms = Objects.keys(socket.rooms);
    console.log(rooms); // [ , "room 237" ]
  });
});

socket.use:注冊中間件,當任何訊息流經(jīng)該中間件時執(zhí)行中間件中的內(nèi)容,該中間件會接受參數(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ā)送一個message事件,接收要發(fā)送的內(nèi)容和回調(diào)函數(shù)為參數(shù)

 socket.send("hi", function(data) {
    console.log(data);
});
// 客戶端
 socket.on("message", function(data) {
    console.log(data);
  })

socket.emit: 重寫/強化 EventEmitter.emit方法,通過事件名來觸發(fā)事件給指定的socket,任意多的參數(shù)都可被傳入,支持所有可序列化的數(shù)據(jù)結(jié)構(gòu)。
接收一下參數(shù):

eventName (字符串)
args 所以可序列化的數(shù)據(jù)結(jié)構(gòu)  包括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房間內(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:從指定的房間里移除客戶端,并且可選擇的執(zhí)行一個異常回調(diào)函數(shù),與當客戶端的連接丟失后,會自動的將其從房間移除

socket.leave("room 237",(res)=>{
    console.log(res)
})

socket.io中的namespace和room,可參考文章:http://blog.csdn.net/lijiecon...
以上就是常用的服務API,下面介紹客戶端的socket.io

客戶端

IO: 創(chuàng)建socket連接,還可指定命名空間

io("http://localhost/users"); 
// 則將會對http://localhost進行傳輸連接,并且http://Socket.IO連接將會對"/users"建立連接。

也可提供查詢參數(shù):

io("http://localhost/users?token=abc")

還可以使用多路復用、攜帶額外的請求頭
詳細文檔可參考: https://socket.io/docs/client...
connect: 監(jiān)聽是否與服務器連接成功,接收回調(diào)函數(shù)

const socket = io("http://localhost");

socket.on("connect", () => {
  console.log("conncet ok");
});

connect_error:接錯誤觸發(fā)事件處理器

socket.on("connect_error", (error) => {
  // ...
});

disconnect:丟失連接時觸發(fā)時間處理器

socket.on("disconnect", (timeout) => {
  // ...
});

reconnect: 成功的重連時觸發(fā)時間處理器

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: 向服務端發(fā)送,與服務端的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(): 手動關(guān)閉客戶端對服務器的鏈接

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/91763.html

相關(guān)文章

  • vue2.0開發(fā)聊天程序(五) 客戶端的webScoket

    摘要:先看看兼容性創(chuàng)建連接構(gòu)造函數(shù)接收兩個參數(shù)這里的不能是或者而是對應的或者和是定義的兩種方案,類似于類似于協(xié)議名稱,是可選的。服務端和客戶端的協(xié)議名稱必須一致。協(xié)議有三種注冊協(xié)議,開放協(xié)議,自定義協(xié)議。限制以內(nèi)就是在構(gòu)造函數(shù)中選傳的參數(shù)。 愿天下所有的情侶,都是失散多年的兄妹                  ——好妹妹webScoket是html5提出的一個協(xié)議,咱們用的http是無狀態(tài)...

    meteor199 評論0 收藏0
  • vue2.0開發(fā)聊天程序() 搞定mongodb

    摘要:為安裝文件,無需再配置環(huán)境變量。連接操作有以下包作者并未查到除此之外的包,但不代表沒有。等于是每個默認配置的主鍵屬性,屬性名為可自己定義一個來覆蓋此屬性。需要注意的是,在新版本的文檔中,為。通過創(chuàng)建限于篇幅,本小節(jié)暫時寫到這里。 我的琴聲嗚咽,我的淚水全無。我把遠方的遠歸還草原。                   - 海子《九月》 mongodb安裝 什么是Mongodb?就是一個基...

    Dr_Noooo 評論0 收藏0
  • 坑系列之阿里SLB上使用Webscoket

    摘要:最終獲得一個鏈接,里面有這樣的描述如何在阿里云負載均衡上啟用支持無需配置,當選用監(jiān)聽時,默認支持無加密版本協(xié)議協(xié)議當選擇監(jiān)聽時,默認支持加密版本的協(xié)議協(xié)議。詳細參見如何使用負載均衡性能保障型實例。 Websocket是HTML5之后的一個新事物,可以方便的實現(xiàn)客戶端到服務端的長會話,特別適合用于客戶端需要接收服務端推送的場景。例如在線客服聊天,提醒推送等等。改變了以往客戶端只能通過輪詢...

    1treeS 評論0 收藏0
  • vue2.0開發(fā)聊天程序(八) 初步完成

    摘要:主要表現(xiàn)在復雜的語句事務支持等。僅支持,在等瀏覽器中,會出現(xiàn)樣式布局混亂的情況。將群群對應的聊天記錄保存在數(shù)據(jù)庫。用戶進入群聊,則將其加入到對應的中。文件大小不能超過通過模塊操作登錄注冊將用戶名作為唯一值。登錄支持自動登錄,將密碼保存在中。 showImg(https://segmentfault.com/img/bV4jYr?w=402&h=710);showImg(https://...

    wmui 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<