当前位置:   article > 正文

使用node简单搭建websocket服务器_node搭建websocket服务器搭建

node搭建websocket服务器搭建

背景

我们都知道,http协议通信只能由客户端发起,然后服务端再做出响应;但是websocket协议最大的特点是服务端可以主动向客户端推送消息,客户端也可以主动向服务器发送消息

往常实现双向通信的方法主要是轮询,客户端通过定时器,每隔一段时间就会主动发送请求给服务器,这无疑是会耗很多的流量和给服务端造成资源消耗;而websokcet实时性更强,当服务器和客户端之间交换数据时更少的控制开销。

node搭建websocket服务器

下载websocket依赖  websocket - npm

npm i websocket

在文件下下创建server.js 文件,跟着npm文档的例子引入使用即可

  1. /* server.js 服务器 */
  2. // 引入
  3. const WebSocketServer = require('websocket').server
  4. const http = require('http')
  5. const port = 8000
  6. let time = 0
  7. // 创建服务器
  8. const server = http.createServer((request, response) => {
  9. console.log(`${new Date().toLocaleDateString()} Received request for ${request.url}`)
  10. response.writeHead(404)
  11. response.end()
  12. })
  13. server.listen(port, () => {
  14. console.log(`${new Date().toLocaleDateString()} Server is listening on port ${port}`)
  15. })
  16. // websocket 服务器
  17. const wsServer = new WebSocketServer({
  18. httpServer: server
  19. })
  20. // 建立连接
  21. wsServer.on('request', (request) => {
  22. // 当前的连接
  23. console.log(request.origin, '=======request.origin=======')
  24. const connection = request.accept(null, request.origin)
  25. console.log(`${new Date().toLocaleDateString()} 已经建立连接`)
  26. setInterval(() => {
  27. const obj = {
  28. title: '标题' + time++,
  29. value: '内容' + time++
  30. }
  31. connection.send(JSON.stringify(obj))
  32. }, 2000)
  33. // 监听客户端发来的的消息
  34. connection.on('message', (message) => {
  35. console.log('message========>', message)
  36. if (message.type === 'utf8') {
  37. console.log('Received Message: ' + message.utf8Data);
  38. // connection.sendUTF(message.utf8Data);
  39. } else if (message.type === 'binary') {
  40. // binary 二进制
  41. console.log('Received Binary Message of ' + message.binaryData.length + ' bytes');
  42. // connection.sendBytes(message.binaryData);
  43. }
  44. });
  45. // 监听当前连接 当断开链接(网页关闭) 触发
  46. connection.on('close', (reasonCdoe, description) => {
  47. console.log(`${new Date().toLocaleDateString()} ${connection.remoteAddress} 断开链接`)
  48. })
  49. })

客户端实现

在文件下下新建index.html文件,更多的api介绍可看文档 WebSocket - Web API 接口参考 | MDN

  1. // index.html
  2. <script>
  3. // 创建webscoket 对象 地址填入本地ip 端口是在搭建websocket服务器定义的端口
  4. const ws = new WebSocket('ws://127.0.0.1:8000')
  5. // 执行上面的语句之后,客户端就会与服务器进行连接
  6. // readyState返回当前实例对象的当前状态
  7. /*
  8. 共有四种状态
  9. CONNECTING: 值为0,表示正在连接
  10. OPEN: 值为1,表示连接成功,可以通信了
  11. CLOSING 值为2, 表示连接正在关闭
  12. CLOSED 值为3,表示连接已经关闭了,或者打开连接失败
  13. */
  14. // 实例对象的onopen属性,用于指定连接成功后的回调函数
  15. ws.onopen = (res) => {
  16. console.log('onopen readyState',ws.readyState)
  17. console.log('onopen 连接成功==========>', res)
  18. }
  19. // 实例对象的onmessage属性,用于指定收到服务器数据后的回调函数
  20. ws.onmessage = ({ data }) => {
  21. console.log('onmessage readyState',ws.readyState)
  22. // 注意此时的data是json格式的 需要转化下
  23. console.log('onmessage 有新消息啦=======>', JSON.parse(data))
  24. // 实例对象的send方法给服务器发送消息
  25. ws.send('客户端发送的消息'
  26. }
  27. // 实例对象的onclose属性,用于连接关闭后的回调 函数
  28. // 当关闭了服务器后 会走到此回调函数
  29. ws.onclose = () => {
  30. console.log('onclose readyState',ws.readyState)
  31. console.log('onclose websocket连接关闭=======>')
  32. }
  33. // 连接发生错误的回调方法
  34. // 如当服务器没有启动 就会走到这个错误回调
  35. ws.onerror = (error) => {
  36. console.log('onerror readyState',ws.readyState)
  37. console.log('onerror 发生错误==========>', error)
  38. }
  39. </script>

拓展

在服务器重启或是弱网情况下,前端不能保证一直连接成功。因此在出现被动断开的情况下,需要有心跳机制断线重连的功能。

后续单独详说这部分。

websocket使用场景

目前来说,我在工作中用到websocket的主要场景是:需要实时轮播通告用户订阅的消息,实时的图表数据展示。

当然还有应用最广泛的是使用websocekt实现聊天室功能,这个还没玩过

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/634571
推荐阅读
相关标签