当前位置:   article > 正文

【前端系列】前端如何使用websocket发送消息_websocket前端发送消息

websocket前端发送消息

序言

今天来学习一下前端如何使用websocket发送消息

1 基础介绍

1.1 什么是WebSocket

WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议,它可以让客户端和服务器之间进行实时的双向通信。与传统的 HTTP 请求不同,WebSocket 使用了一个长连接,在客户端和服务器之间保持持久的连接,从而可以实时地发送和接收数据。

在 WebSocket 中,客户端和服务器之间可以互相发送消息。

客户端可以使用 JavaScript 中的 WebSocket API 发送消息到服务器,也可以接收服务器发送的消息。

1.2 代码示例

下面是一个使用 WebSocket API 发送消息的代码示例:

  1. var socket = new WebSocket("ws://example.com/socketserver");
  2. socket.onopen = function(event) {
  3. socket.send("Hello server!");
  4. };
  5. socket.onmessage = function(event) {
  6. console.log("Received message from server: " + event.data);
  7. };
  8. socket.onerror = function(event) {
  9. console.log("WebSocket error: " + event.error);
  10. };
  11. socket.onclose = function(event) {
  12. console.log("WebSocket connection closed with code " + event.code);
  13. };

在上面的代码中,首先创建了一个 WebSocket 对象,指定了服务器的地址。然后在 onopen 回调函数中,发送了一个消息到服务器。当服务器发送消息到客户端时,onmessage 回调函数会被触发,从而可以处理服务器发送的消息。如果出现错误或者连接被关闭,onerror 和 onclose 回调函数会被触发,从而可以处理这些事件。

需要注意的是,在使用 WebSocket 发送消息之前,必须先建立 WebSocket 连接。在上面的代码中,通过创建一个 WebSocket 对象来建立连接,然后在 onopen 回调函数中发送消息到服务器。如果在连接建立之前就尝试发送消息,那么这些消息将无法发送成功。

2 案例讲解

2.1 vue怎么用websocket发送请求

在 Vue 中使用 WebSocket,可以借助 WebSocket 对象来创建 WebSocket 连接,并通过 send() 方法向服务器发送消息。

下面是一个基本的 Vue 组件,演示如何使用 WebSocket 发送和接收消息:

  1. <template>
  2. <div>
  3. <input v-model="message" @keyup.enter="sendMessage">
  4. <button @click="sendMessage">Send</button>
  5. <ul>
  6. <li v-for="msg in messages">{{ msg }}</li>
  7. </ul>
  8. </div>
  9. </template>
  10. <script>
  11. export default {
  12. data() {
  13. return {
  14. message: '',
  15. messages: [],
  16. socket: null
  17. }
  18. },
  19. created() {
  20. this.socket = new WebSocket('ws://localhost:3000')
  21. this.socket.addEventListener('message', this.handleMessage)
  22. },
  23. beforeDestroy() {
  24. this.socket.close()
  25. },
  26. methods: {
  27. sendMessage() {
  28. this.socket.send(this.message)
  29. this.message = ''
  30. },
  31. handleMessage(event) {
  32. this.messages.push(event.data)
  33. }
  34. }
  35. }
  36. </script>

在上面的代码中,

  • 首先在 created 钩子函数中创建了一个 WebSocket 对象,并添加了一个消息处理函数 handleMessage
  • 在 sendMessage 方法中,将用户输入的消息发送到服务器。
  • 在 handleMessage 方法中,将从服务器接收到的消息添加到 messages 数组中,从而可以在界面上显示出来。
  • 在组件销毁之前,需要调用 close() 方法关闭 WebSocket 连接。

需要注意的是,在使用 WebSocket 时,需要考虑跨域问题。如果 WebSocket 连接的 URL 和当前页面的 URL 不同,那么需要在服务器端进行相应的跨域设置。同时,需要注意在发送和接收消息时的数据格式,通常需要将数据转换为 JSON 字符串进行传输。

2.2 this.message 怎么组装

在上面的 Vue 组件中,this.message 是用户输入的消息文本,可以通过绑定 v-model 实现双向绑定。

当用户输入消息后,可以将消息文本直接发送到服务器。在发送消息之前,可以根据需要对消息进行组装,例如添加消息的发送者、时间等信息,以便在服务器端进行更好的处理。

以下是一个示例,假设要发送的消息格式为一个包含文本和时间戳的 JSON 对象:

  1. <template>
  2. <div>
  3. <input v-model="message.text" @keyup.enter="sendMessage">
  4. <button @click="sendMessage">Send</button>
  5. <ul>
  6. <li v-for="msg in messages">{{ msg.text }} ({{ msg.timestamp }})</li>
  7. </ul>
  8. </div>
  9. </template>
  10. <script>
  11. export default {
  12. data() {
  13. return {
  14. message: {
  15. text: '',
  16. timestamp: null
  17. },
  18. messages: [],
  19. socket: null
  20. }
  21. },
  22. created() {
  23. this.socket = new WebSocket('ws://localhost:3000')
  24. this.socket.addEventListener('message', this.handleMessage)
  25. },
  26. beforeDestroy() {
  27. this.socket.close()
  28. },
  29. methods: {
  30. sendMessage() {
  31. this.message.timestamp = new Date().toISOString()
  32. const json = JSON.stringify(this.message)
  33. this.socket.send(json)
  34. this.message.text = ''
  35. this.message.timestamp = null
  36. },
  37. handleMessage(event) {
  38. const msg = JSON.parse(event.data)
  39. this.messages.push(msg)
  40. }
  41. }
  42. }
  43. </script>

在上面的代码中,

  • this.message 是一个包含 text 和 timestamp 两个属性的对象,在用户输入消息后,将消息文本赋值给 text 属性。
  • 在发送消息之前,将当前时间戳赋值给 timestamp 属性,并将消息对象转换为 JSON 字符串,然后通过 WebSocket 发送出去。
  • 在接收到服务器发送的消息后,将 JSON 字符串解析为消息对象,并将消息对象添加到 messages 数组中,从而可以在界面上显示出来。

2.3 发送示例

要发送这个:

  1. {
  2. "msg_id": "1",
  3. "msg_type": "test",
  4. "content": {
  5. "count": "10"
  6. }
  7. }

代码实现

要发送这个 JSON 数据,可以先将其转换为字符串,然后通过 WebSocket 发送出去。

以下是一个示例代码,假设使用 axios 库来发送 WebSocket 请求:

  1. import axios from 'axios'
  2. const ws = new WebSocket('ws://localhost:3000')
  3. ws.onopen = () => {
  4. const data = {
  5. msg_id: '1',
  6. msg_type: 'test',
  7. content: {
  8. count: '10'
  9. }
  10. }
  11. const jsonString = JSON.stringify(data)
  12. ws.send(jsonString)
  13. }
  14. ws.onmessage = (event) => {
  15. const response = JSON.parse(event.data)
  16. console.log('Received message:', response)
  17. }
  18. ws.onerror = (error) => {
  19. console.error('WebSocket error:', error)
  20. }
  21. function sendWebSocketRequest(data) {
  22. const jsonString = JSON.stringify(data)
  23. ws.send(jsonString)
  24. }
  25. export default {
  26. sendWebSocketRequest
  27. }

在上面的代码中,

  • 首先创建了一个 WebSocket 对象,并在 onopen 回调函数中发送了一条 WebSocket 请求。
  • 在 onmessage 回调函数中处理服务器返回的响应数据。
  • 在 onerror 回调函数中处理 WebSocket 错误。

优化

为了方便使用,将发送 WebSocket 请求的代码封装在 sendWebSocketRequest 函数中,可以在其他组件中直接调用该函数来发送 WebSocket 请求。例如:

  1. import { sendWebSocketRequest } from '@/api/websocket'
  2. sendWebSocketRequest({
  3. msg_id: '1',
  4. msg_type: 'test',
  5. content: {
  6. count: '10'
  7. }
  8. }).then(response => {
  9. console.log('Received response:', response)
  10. }).catch(error => {
  11. console.error('WebSocket error:', error)
  12. })

在上面的代码中,调用 sendWebSocketRequest 函数发送 WebSocket 请求,并在请求成功或失败时打印相应的日志。

2.4 接收示例

返回参数是这个,我该怎么接收:

  1. {
  2. "msg_id": "1",
  3. "msg_type": "test",
  4. "code": 0,
  5. "err_msg": "Success.",
  6. "content": {
  7. "count": "20"
  8. }
  9. }

代码实现

要接收和处理服务器返回的 JSON 数据,可以在 onmessage 回调函数中处理接收到的消息。

以下是一个示例代码,假设使用 axios 库发送 WebSocket 请求:

  1. import axios from 'axios'
  2. const ws = new WebSocket('ws://localhost:3000')
  3. ws.onopen = () => {
  4. const data = {
  5. msg_id: '1',
  6. msg_type: 'test',
  7. code: 0,
  8. err_msg: 'Success.',
  9. content: {
  10. count: '20'
  11. }
  12. }
  13. const jsonString = JSON.stringify(data)
  14. ws.send(jsonString)
  15. }
  16. ws.onmessage = (event) => {
  17. const response = JSON.parse(event.data)
  18. console.log('Received message:', response)
  19. // 处理返回的数据
  20. if (response.code === 0) {
  21. console.log('Success:', response.content)
  22. } else {
  23. console.error('Error:', response.err_msg)
  24. }
  25. }
  26. ws.onerror = (error) => {
  27. console.error('WebSocket error:', error)
  28. }
  29. function sendWebSocketRequest(data) {
  30. const jsonString = JSON.stringify(data)
  31. ws.send(jsonString)
  32. }
  33. export default {
  34. sendWebSocketRequest
  35. }

在上面的代码中,使用 JSON.parse() 方法将接收到的消息转换为 JSON 对象,并在 onmessage 回调函数中处理返回的数据。如果返回的数据中 code 属性为 0,表示请求成功,可以在控制台打印返回的数据;否则,表示请求失败,可以在控制台打印错误信息。

3 图书推荐 

图书名称:《同构:编程中的数学》

“数学是思维的体操。”而编程是一项高度复杂的思维活动。学习数学思想对编程的益处不言而喻。

《同构:编程中的数学》从数字、递归、对称、范畴、融合、无穷、悖论七个方面介绍了计算机程序的数学基础和原理,并以“同构”概念为线索揭示出编程本质上是和数学同构的。
小伙伴可以先睹为快:《同构:编程中的数学》

内容简介

本书从数字、递归、对称、范畴、融合、无穷、悖论七个方面介绍了计算机程序的数学基础和原理,并以“同构”概念为线索揭示出编程本质上是和数学同构的。

  • 第1章介绍皮亚诺算术公理系统,通过5条公理,构筑了计算机程序大厦的基石;通过单向链表、斐波那契数列等例子,展示了和自然数同构的计算结构。
  • 第2章介绍递归,通过欧几里得算法作为开端,最终把递归的数学原理构建在Lambda演算和Y组合子之上。
  • 第3章介绍对称群、环、域等抽象代数结构,解释了伽罗瓦理论这一抽象思维的明珠。
  • 第4章介绍范畴论,把列表、异常、多态、类型系统、复合数据结构等众多编程概念构筑在范畴论的基础上。
  • 第5章介绍融合律,它是进行算法推导和优化的有力工具。
  • 第6章介绍无穷,给出了康托尔的无穷集合论和超限数概念,介绍了编程中流的概念和无穷的关系。
  • 第7章以罗素悖论、可计算性和哥德尔不完全性定理结束本书,介绍了计算能力的边界和对编程基础哲学的影响。

本书还在各个章节中介绍相关数学家的人生经历和逸闻趣事,讲解他们如何克服困难、追求真理、创造奇迹,并穿插讲述编程、数学、艺术、音乐之间的有趣联系。  

作者简介

刘新宇 

亚马逊中国研发中心研发经理,负责分布式仓储物流系统的开发。

1999年和2002年在清华大学自动化系分别获得学士和硕士学位。长期专注于函数式基础算法,著有《算法新解》一书(2017年出版)。

 参与方式 

图书数量:本次送出 4 本   !!!⭐️⭐️⭐️
活动时间:截止到 2023-07-04 12:00:00

抽奖方式:

  • 在新星计划【云原生之k8s入门】方向参加的小伙伴中随机抽取

参与方式:

参与方式:关注博主、点赞、收藏,参与活动

中奖名单 

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