由于我的对概念理解不是很深,文字表达能力不强,若是有关HTTP等方面描述不许确,欢迎纠正,谢谢你们
html
初次接触 WebSocket 的人,都会问一样的问题:咱们已经有了 HTTP 协议,为何还须要另外一个协议?它能带来什么好处?答案很简单,由于 HTTP 协议有一个缺陷:通讯只能由客户端发起。node
举例来讲:咱们想了解今天的天气,只能是客户端向服务器发出请求,服务器返回查询结果。HTTP 协议作不到服务器主动向客户端推送信息。web
这种单向请求的特色,注定了若是服务器有连续的状态变化,客户端要获知就很是麻烦。咱们只能使用"轮询":设置定时器每隔一段时候,就发出一个"询问"(简单理解为ajax请求),了解服务器有没有新的信息。最典型的场景就是聊天室。ajax
---- 参考了
阮一峰
老师的文章: WebSocket 教程npm
普通的http通讯是基于字符的通讯(超文本), websocket一开始是文本协议, 当连接创建后变成二进制协议, 数据无需转换,所以效率高。
socket.io是一个封装后的库,原生 websocket 比较复杂,须要本身处理请求头,设置持续连接等等。所以使用socket.io
npm i socket.io -D
socket主要有两个方法:sock.emit('name', data)
主动发送数据sock.on('name', function(data
){ })` 接收数据跨域
// server.js const http = require('http') const io = require('socket.io') let server = http.createServer((req, res)=>{}) server.listen(8080) // 创建ws websocket简称ws let wsServer = io.listen(server); wsServer.on('connection', sock=>{ sock.on('aaa', function(a,b){ // name -> 'aaa' 要与前台的 name 保持一致 console.log(a) console.log(b) console.log(arguments) }) // 'aaa'事件名与前台的一致 setInterval(function(){ sock.emit('bbb', '服务器发来的数据') // name -> 'bbb' 要与前台的 name 保持一致 }, 2000) })
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <script src='http://localhost:8080/socket.io/socket.io.js'></script> <!-- 有人好奇 XXX/socket.io/socket.io.js 文件,为何个人目录里没有啊,这个是从你的/node_modules/下获取的。 当向后台发送请求后,socket会判断req.url,作一个相似于下面的处理,读取 socket-io.js: if(req.url == '/socket.io/socket.io.js'){ fs.readFile('node_modules/socket.io-client/dist/socket-io.js') } 固然咱们也能够直接将socket-io.js复制出来,直接用script引用,可是若是socket更新后咱们的代码可能不是最新版,会出现一些问题。 所以不建议这样使用:<script src='./socket.io.js'></script> --> <script> let sock = io.connect('ws://localhost:8080/') // 这里是 ws 协议,不是 http 协议 // sock.emit // sock.on sock.emit('aaa', 'maruihua', 5 ) sock.on('bbb', data => console.log(data)) </script> </head> <body> </body> </html>
上面的代码直接复制下来就能使用。怎么运行nodejs服务我就再也不讲了啊。
怎么样,是否是特别简单
妈妈不再用担忧个人学习了~服务器