Skip to content

uniapp-websocket实现

官方文档

https://uniapp.dcloud.net.cn/api/request/websocket.html#connectsocket

属性认识

connectsocket创建连接

在uniapp中,实现WebSocket可以使用官方给我们提供的uni.connectSocket方法来创建一个WebSocket连接。该方法接受一个对象作为参数,该对象包含以下属性:

JS
- url:WebSocket服务器的URL地址。
- header:HTTP请求头,可以用来传递一些自定义的参数。
- protocols:WebSocket子协议,可以用来指定WebSocket连接使用的协议。
- method:HTTP请求方法,默认为GET。

下面是一个uni.connectSocket创建WebSocket连接的示例:

JS
uni.connectSocket({
	url: 'wss://www.example.com/socket',
	header: {
		'content-type': 'application/json'
	},
	protocols: ['protocol1'],
	method: 'GET'
});

打开连接onSocketOpen

JS
uni.connectSocket({
  url: 'wss://www.example.com/socket'
});
uni.onSocketOpen(function (res) {
  console.log('WebSocket连接已打开!');
});

监听错误onSocketError

JS
uni.onSocketError(function (res) {
  console.log('WebSocket连接打开失败,请检查!');
});

发送数据sendSocketMessage

JS
 uni.sendSocketMessage({
    data: msg
});

接收信息onSocketMessage

JS
uni.connectSocket({
  url: 'wss://www.example.com/socket'
});

uni.onSocketMessage(function (res) {
  console.log('收到服务器内容:' + res.data);
});

关闭连接closeSocket

JS
uni.closeSocket(OBJECT)

监听WebSocket关闭

JS
uni.onSocketClose(function (res) {
  console.log('WebSocket 已关闭!');
});

项目使用

接下来我们就在项目之中连接我们的WebSocket服务,并监听消息。

JS
<template>
  <view>
  </view>
</template>
<script setup name="websocket">
import { ref, onMounted, onUnmounted } from 'vue';

// WebSocket 状态和通知列表
const wsOpen = ref(false);
const noticeList = ref([]);

// WebSocket 连接实例
let ws = null;

// 在组件挂载时创建 WebSocket 连接
onMounted(() => {
  // 使用 uni.connectSocket 代替 new WebSocket
  ws = uni.connectSocket({
    url: xxx,// WebSocket 服务器地址
    success() {
      console.log('WebSocket 连接成功');
      wsOpen.value = true;
    },
    fail() {
      console.error('WebSocket 连接失败');
    }
  });

  // 监听 WebSocket 消息事件
  uni.onSocketMessage((event) => {
    console.log('收到消息:', event.data);
    try {
      const message = JSON.parse(event.data);
      if (message.type === 'info') {
        noticeList.value.push(message.data); 
		uni.showModal({
			title: `通知`,
			cancelText:'取消',
			confirmText:'查看',
			cancelColor:"#ccc",
			confirmColor:'#8f41e9',
			content: `${message.data}`,
			success: function (res) {
				if (res.confirm) {
					console.log('用户点击确定');
				} else if (res.cancel) {
					console.log('用户点击取消');
				}
			}
		});
      }
    } catch (error) {
      console.error('消息解析错误:', error);
    }
  });

  // 监听 WebSocket 错误事件
  uni.onSocketError((error) => {
    console.error('WebSocket 发生错误:', error);
  });

  // 监听 WebSocket 关闭事件
  uni.onSocketClose(() => {
    console.log('WebSocket 连接已关闭');
    wsOpen.value = false;
  });
});

// 在组件卸载时关闭 WebSocket 连接
onUnmounted(() => {
  if (ws) {
    uni.closeSocket(); // 关闭 WebSocket 连接
  }
});
</script>

Released under the MIT License.