1. class websocketUtil {
    2. constructor(url, time) {
    3. this.is_open_socket = false //避免重复连接
    4. this.url = url //地址
    5. this.data = null
    6. //心跳检测
    7. this.timeout= time //多少秒执行检测
    8. this.heartbeatInterval= null //检测服务器端是否还活着
    9. this.reconnectTimeOut= null //重连之后多久再次重连
    10. try {
    11. return this.connectSocketInit()
    12. } catch (e) {
    13. console.log('catch');
    14. this.is_open_socket = false
    15. this.reconnect();
    16. }
    17. }
    18. // 进入这个页面的时候创建websocket连接【整个页面随时使用】
    19. connectSocketInit() {
    20. this.socketTask = uni.connectSocket({
    21. url: this.url,
    22. success:()=>{
    23. console.log("正准备建立websocket中...");
    24. // 返回实例
    25. return this.socketTask
    26. },
    27. });
    28. this.socketTask.onOpen((res) => {
    29. console.log("WebSocket连接正常!");
    30. clearTimeout(this.reconnectTimeOut)
    31. clearTimeout(this.heartbeatInterval)
    32. this.is_open_socket = true;
    33. this.start();
    34. // 注:只有连接正常打开中 ,才能正常收到消息
    35. this.socketTask.onMessage((res) => {
    36. console.log(res.data)
    37. });
    38. })
    39. // 监听连接失败,这里代码我注释掉的原因是因为如果服务器关闭后,和下面的onclose方法一起发起重连操作,这样会导致重复连接
    40. // uni.onSocketError((res) => {
    41. // console.log('WebSocket连接打开失败,请检查!');
    42. // this.is_open_socket = false;
    43. // this.reconnect();
    44. // });
    45. // 这里仅是事件监听【如果socket关闭了会执行】
    46. this.socketTask.onClose(() => {
    47. console.log("已经被关闭了")
    48. this.is_open_socket = false;
    49. this.reconnect();
    50. })
    51. }
    52. //发送消息
    53. send(value){
    54. // 注:只有连接正常打开中 ,才能正常成功发送消息
    55. this.socketTask.send({
    56. data: value,
    57. async success() {
    58. console.log("消息发送成功");
    59. },
    60. });
    61. }
    62. //开启心跳检测
    63. start(){
    64. this.heartbeatInterval = setTimeout(()=>{
    65. this.data={value:"传输内容",method:"方法名称"}
    66. console.log(this.data)
    67. this.send(JSON.stringify(this.data));
    68. },this.timeout)
    69. }
    70. //重新连接
    71. reconnect(){
    72. //停止发送心跳
    73. clearInterval(this.heartbeatInterval)
    74. //如果不是人为关闭的话,进行重连
    75. if(!this.is_open_socket){
    76. this.reconnectTimeOut = setTimeout(()=>{
    77. this.connectSocketInit();
    78. },3000)
    79. }
    80. }
    81. }
    82. module.exports = websocketUtil
    1. // 在测试环境时url可以写成 ws://xxx:3100/connect/websocket
    2. new wsRequest("ws://xxx:3100/connect/websocket",5000)
    3. // 发布体验版或正式版,url一定要写成 wss://xxx:3100/connect/websocket
    4. new wsRequest("wss://xxx:3100/connect/websocket",5000)
    5. // 除此之外,还需要在微信管理平台中对小程序的开发–>开发管理–>开发设置–>服务器域名 加入socket配置

    烈阳,(uni-app使用websocket(封装、心跳检测))