摘要:提供了基于事件的實(shí)時(shí)雙向通訊服務(wù)端與客戶端連接同時(shí)提供了服務(wù)端和客戶端的服務(wù)端必須綁定一個(gè)實(shí)例綁定隱式綁定通過(guò)實(shí)例化時(shí)傳入端口或?qū)嵗笳{(diào)用或函數(shù)進(jìn)行隱式綁定?;谶@種機(jī)制,可以實(shí)現(xiàn)雙向交流。
socket.io提供了基于事件的實(shí)時(shí)雙向通訊
服務(wù)端與客戶端連接socket.io同時(shí)提供了服務(wù)端和客戶端的API
服務(wù)端socket.io必須綁定一個(gè)http.Server實(shí)例
綁定http.Server隱式綁定
通過(guò)實(shí)例化時(shí)傳入端口或?qū)嵗笳{(diào)用listen或attach函數(shù)進(jìn)行隱式綁定。socket.io內(nèi)部實(shí)例化并監(jiān)聽(tīng)http.Server
實(shí)例化時(shí)傳入端口
let io = require("socket.io")(3000)
直接通過(guò)listen或attach函數(shù)綁定。listen與attach同義
let io = require("socket.io") io.listen(3000) // io.attach(3000)
顯示綁定
可以手動(dòng)指定http.Server
實(shí)例化時(shí)綁定
let server = require("http").Server(); let io = require("socket.io")(server) server.listen(3000)
通過(guò)listen或attach綁定
let server = require("http").Server(); let io = require("socket.io")() io.listen(server) // io.attach(server) server.listen(3000)
可以綁定express或koa等http框架
express
let app = require("express") let server = require("http").Server(app) let io = require("socket.io")(server) app.listen(3000)
koa
let app = require("koa")() let server = require("http").Server(app.callback()) let io = require("socket.io")(server) app.listen(3000)監(jiān)聽(tīng)連接狀態(tài)
當(dāng)服務(wù)器端與客戶端連接成功時(shí),服務(wù)端會(huì)監(jiān)聽(tīng)到connection和connect事件(connection與connect同義), 客戶端會(huì)監(jiān)聽(tīng)到connect事件, 斷開(kāi)連接時(shí)服務(wù)端的對(duì)應(yīng)到客戶端的socket與客戶端均會(huì)均會(huì)監(jiān)聽(tīng)到disconnect事件
服務(wù)端代碼
let server = require("http").Server() let io = require("socket.io")(server) server.listen(3000); io.on("connection", socket => { console.log("connect") socket.on("disconnect", () => { console.log("disconnect") }) socket.disconnect() })
運(yùn)行后打印
connect disconnect
客戶端代碼
let socket = io("http://localhost:3000") socket.on("connect", () => { console.log("connect") }) socket.on("disconnect", () => { console.log("disconnect") })
運(yùn)行后打印
connect disconnect傳輸數(shù)據(jù)
服務(wù)器與客戶端的socket是一個(gè)關(guān)聯(lián)的EventEmitter對(duì)象,客戶端socket派發(fā)的事件可以通以被服務(wù)端的socket接收,服務(wù)器端socket派發(fā)的事件也可以被客戶端接受。基于這種機(jī)制,可以實(shí)現(xiàn)雙向交流。
現(xiàn)在模擬這樣一種情況:客戶端不停發(fā)送隨機(jī)數(shù),當(dāng)隨機(jī)數(shù)大于0.95時(shí),服務(wù)端延時(shí)1s后向客戶端發(fā)送警告以及警告次數(shù)
服務(wù)端代碼
let server = require("http").Server() let io = require("socket.io")(server) server.listen(3000); io.on("connection", socket => { socket.on("random", value => { console.log(value) if (value > 0.95) { if (typeof socket.warning === "undefined") socket.warning = 0 setTimeout(() => { socket.emit("warn", ++socket.warning) }, 1000) } }) })
socket對(duì)象可以用來(lái)存儲(chǔ)狀態(tài)信息和自定義數(shù)據(jù),如socket.warning
客戶端代碼
let socket = io("http://localhost:3000") let interval = setInterval(() => { socket.emit("random", Math.random()) }, 500) socket.on("warn", count => { console.log("warning count: " + count) }) socket.on("disconnect", () => { clearInterval(interval) })傳輸流
socket.io可以處理流
服務(wù)端代碼
io.on("connection", function (socket) { let stream = ss.createStream() ss(socket).emit("script", stream) fs.createReadStream(__filename).pipe(stream) })
客戶端代碼
let socket = io("http://localhost:3000") ss(socket).on("script", stream => { let buffer = "" stream.on("data", data => { buffer += data.toString() }) stream.on("end", () => { console.log(buffer) }) })
更多文章的目錄在這里
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/82577.html
摘要:就是為了解決這一問(wèn)題產(chǎn)生的,現(xiàn)在已經(jīng)寫(xiě)入標(biāo)準(zhǔn),主流瀏覽器基本支持。 由于最近寫(xiě)項(xiàng)目要使用socekt.io技術(shù),于是研究了一段時(shí)間,把自己早期學(xué)習(xí)階段寫(xiě)的小游戲改造了一下,變成了一個(gè)比較完整的小程序。點(diǎn)擊這里可以體驗(yàn)游戲,建議使用手機(jī)模式查看,也可以下載打包好的webapp,安卓版已上架酷安市場(chǎng),掃碼可下載體驗(yàn): showImg(https://segmentfault.com/img...
摘要:演示地址實(shí)時(shí)畫(huà)板聊天室你畫(huà)我猜聊天室圖片搶先看解釋關(guān)于是基于實(shí)現(xiàn)的套接字前端后端數(shù)據(jù)交互的庫(kù),通過(guò)它的封裝,使用者可以很方便的開(kāi)發(fā),而且支持長(zhǎng)輪詢等方法,兼容低版本瀏覽器。最后推薦一個(gè)實(shí)時(shí)的更加優(yōu)秀的游戲。 前言 一直都想好好的學(xué)習(xí)運(yùn)用node,一直都不知道要做什么東西,最近Java Web老師要求做個(gè)前端的應(yīng)用,既然是前端應(yīng)用,那肯定得是單頁(yè)應(yīng)用了,而且node很適用于高并發(fā)的實(shí)時(shí)應(yīng)...
摘要:是,是的,它可以建立起一個(gè)基于事件的實(shí)時(shí)的雙向交流方式,極大的簡(jiǎn)化了的處理過(guò)程。開(kāi)始搭建這個(gè)應(yīng)用幾乎只需要和最初級(jí)的知識(shí),因?yàn)橹淮罱ㄒ粋€(gè)基本的程序。安裝好后創(chuàng)建一個(gè),來(lái)配置應(yīng)用。 WebSocket與Socket.IO WebSocket是一種協(xié)議,有了它就可以在TCP協(xié)議的基礎(chǔ)上在瀏覽器和服務(wù)器之間建立起了一種全雙工的通道,它完全兼容HTTP協(xié)議,有了它使得Web應(yīng)用程序可以在瀏覽器...
摘要:在標(biāo)準(zhǔn)沒(méi)有推出之前,輪詢是唯一可行的方式通過(guò)瀏覽器也可以,但這里不做討論。這種方式存在延時(shí)且對(duì)服務(wù)端造成很大負(fù)載。直到年,才標(biāo)準(zhǔn)化一種基于套接字進(jìn)行收發(fā)數(shù)據(jù)的協(xié)議。現(xiàn)如今主流瀏覽器均已支持。 socket.io提供了基于事件的實(shí)時(shí)雙向通訊 歷史 Web端與服務(wù)器間的實(shí)時(shí)數(shù)據(jù)傳輸?shù)氖且粋€(gè)很重要的需求,但最早只能通過(guò)AJAX輪詢?cè)儗?shí)現(xiàn)。在WebSocket標(biāo)準(zhǔn)沒(méi)有推出之前,AJAX輪詢是唯...
摘要:阻塞當(dāng)進(jìn)行讀寫(xiě)時(shí),線程是阻塞的狀態(tài)。當(dāng)任何一個(gè)收到數(shù)據(jù)后,中斷程序?qū)酒疬M(jìn)程。接收數(shù)據(jù)當(dāng)收到數(shù)據(jù)后,中斷程序會(huì)給的就緒列表添加引用。當(dāng)接收到數(shù)據(jù),中斷程序一方面修改,另一方面喚醒等待隊(duì)列中的進(jìn)程,進(jìn)程再次進(jìn)入運(yùn)行狀態(tài)如下圖。 本篇文章目的在于基本概念和原理的解釋,不會(huì)貼過(guò)多的使用代碼。 什么是NIO Java NIO (New IO)是 Java 的另一個(gè) IO API (來(lái)自 jav...
閱讀 3180·2021-09-10 10:51
閱讀 3361·2021-08-31 09:38
閱讀 1655·2019-08-30 15:54
閱讀 3142·2019-08-29 17:22
閱讀 3222·2019-08-26 13:53
閱讀 1973·2019-08-26 11:59
閱讀 3292·2019-08-26 11:37
閱讀 3319·2019-08-26 10:47