SignalR在启动连接时显示“WebSocket is not in the OPEN state“

按照教程写的SignalR长连接,但是有错 WebSocket is not in the OPEN state。百度提供的解决办法是 引入的库冲突了,把引入的其他js库删掉。

显然试过之后没有解决,还是报这个错误 HubConnection failed to start successfully because of error 'WebSocket is not in the OPEN state'
HubConnection failed to start successfully because of error WebSocket is not in the OPEN state
重新创建了一个vue项目发现居然没有问题,那么问题来了一样的代码 为啥新项目可以连接成功,显示如下
HubConnection connected successfully
想到以前安装过其他版本的SignalR 所以去吧其他依赖全部删除了,但是还是不行,未修改之前代码如下

<template>
  <div class="content">
    <p>webscoket 是否链接</p>
    <p>收到的消息:</p>
  </div>
</template>

<script>
  import * as signalR from '@microsoft/signalr'
  export default {
    data() {
      return {
        title: 'Hello',
        connection: null,
        connected: false,
        msg: '',
      }
    },
    mounted() {
      // 建立连接
      let connection = new signalR.HubConnectionBuilder()
        .withUrl('http://192.168.2.8:7005/Communication', {})
        .configureLogging(signalR.LogLevel.Debug)
        .build() // 此处填服务器地址

      // 注册方法(给后端调用的,需要在methods中定义)
      connection.on('ReceiveMessage', this.connected)

      // 开始连接
      connection.start().catch((err) => {
        console.log(err)
      })
    },
    methods: {
      /* eslint-disable */
      connected(msgInfo) {
        this.$ownerInstance.callMethod('revMsg', msgInfo)
        console.log(msgInfo)
      },
    },
  }
</script>

<style>
  .content {
    padding-left: 20rpx;
  }
</style>

后面发现一个解决办法 就是在withUrl()方法里面加参数

  // 建立连接
  let connection = new signalR.HubConnectionBuilder()
    .withUrl('http://192.168.2.8:7005/Communication', {
      transport: signalR.HttpTransportType.ServerSentEvents,
      logging: signalR.LogLevel.Trace,
    })
    .configureLogging(signalR.LogLevel.Debug)
    .build() // 此处填服务器地址

在此记录一下解决办法, 但是现在新的疑问来了 为什么加上 { transport: signalR.HttpTransportType.ServerSentEvents, logging: signalR.LogLevel.Trace, }参数之后连接就成功了呢,有空再看下微软的文档,如果有知道的大佬,希望大佬能够解释一下

优化封装一下

import * as signalR from '@microsoft/signalr';

function startConnect() {
  try {
    let connection = connectionSignalR();

    //先取消注册,再重新注册,防止重复注册 ReceiveTextMessageWithIdAsync
    connection.off('ReceiveTextMessageWithIdAsync', ReceiveBroadCastMessageHandler());

    //接收普通文本消息
    connection.on('ReceiveTextMessageWithIdAsync', ReceiveBroadCastMessageHandler());

    //接收广播消息
    // connection.on('ReceiveBroadCastMessageAsync', ReceiveBroadCastMessageHandler(message));

    connection.onreconnecting((error) => {
      let errorMessage = `连接丢失,原因为:"${error}"`.
      console.log(errorMessage, 111);
    });

    connection.onclose(async () => {
      connection.off('ReceiveTextMessageWithIdAsync', ReceiveTextMessageHandler());
      connection.stop();
    });

    //开始连接
    connection.start();
  } catch (err) {
    setTimeout(startConnect, 5000);
  }
};


/**
 * 连接signalr
 */
function connectionSignalR() {
  //process.env.VUE_APP_BASE_API
  const url = 'http://192.168.2.8:7005' + '/Communication';
  const connection = new signalR.HubConnectionBuilder()
    .withUrl(url, {
      transport: signalR.HttpTransportType.ServerSentEvents,
      logging: signalR.LogLevel.Trace,
    })
    .withAutomaticReconnect({
      nextRetryDelayInMilliseconds: (retryContext) => {
        //重连规则:重连次数<300:间隔1s;重试次数<3000:间隔5s;重试次数>3000:间隔30s
        let count = retryContext.previousRetryCount / 300;

        if (count < 1) {

          //重试次数<300,间隔1s
          return 1000;

        } else if (count < 10) {

          //重试次数>300:间隔5s
          return 1000 * 5;

        } //重试次数>3000:间隔30s
        else {
          return 1000 * 30;
        }
      },
    })
    .configureLogging(signalR.LogLevel.Debug)
    .build();

  return connection;
}

/**
 * 接收文本消息
 * @param message 消息体
 */
function ReceiveTextMessageHandler(message) {
  debugger
  console.log(message)
}

/**
 * 接收广播消息
 * @param message 消息体
 */
function ReceiveBroadCastMessageHandler(message) {
  console.log(message);
}

export async function useSignalR() {
  debugger

  /**
   * 开始连接SignalR
   */
  startConnect();
}
websocket是一种用于实通信的协议,它允许浏览器和服务器之间进行双向通信。当出现“websocket is already in closing or closed state”错误,意味着websocket已经处于关闭状态或正在关闭过程中。 在正常的websocket通信中,两端可以随通过发送关闭帧来关闭连接。当其中一端发送关闭帧后,另一端也会收到关闭帧,并开始关闭过程。在关闭过程中,双方将交换关闭帧,并逐渐关闭连接。一旦连接完全关闭,websocket处于关闭状态。 但是,如果在关闭过程中尝试发送数据或者出现其他意外情况,websocket可能会进入异常状态,并抛出“websocket is already in closing or closed state”错误。 可能导致此错误的原因有: 1. 在关闭过程中尝试发送数据。一旦关闭帧被发送,websocket连接将处于关闭过程中,此不应再进行数据发送。 2.连接已经关闭的情况下尝试发送数据。一旦连接完全关闭,websocket无法再发送数据。 3. 实现代码中的错误。可能有一些代码逻辑错误导致了此错误的出现。 为了解决此问题,我们需要进行以下检查和修复措施: 1. 确保在关闭过程中不再尝试发送数据。可以通过代码控制发送数据的机,避免在连接关闭的状态下发送数据。 2. 检查代码逻辑,确保没有意外地关闭websocket连接,或者在连接已经关闭后继续进行相关操作。 3. 观察错误发生的环境和间,查找相关代码并进行排查和修复。 总之,当出现“websocket is already in closing or closed state”错误,我们应该检查代码中的发送数据机和关闭连接的逻辑,并修复相关问题,以确保websocket通信的正常进行。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值