国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專(zhuān)欄INFORMATION COLUMN

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

hiyayiji / 3624人閱讀

大吉大利,今晚吃雞!
                   - 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)單多了。

node支持的webSocket

在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ù)端兩部分

服務(wù)端

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

客戶(hù)端

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

相關(guān)文章

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

    摘要:先看看兼容性創(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)...

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

    摘要:為安裝文件,無(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è)基...

    Dr_Noooo 評(píng)論0 收藏0
  • 坑系列之阿里SLB上使用Webscoket

    摘要:最終獲得一個(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)...

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

    摘要:主要表現(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://...

    wmui 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<