aichanya 2022-06-21 20:51
浏览 306
已结题

vue连接websocket报错

 问题遇到的现象和发生背景:
一个在线聊天的前端页面

 问题相关代码:


<template>
  <div class="websocket">
    <el-row :gutter="20">
      <el-col :span="12" :offset="6">
        <div class="main">
          <el-row>
            <el-input
                placeholder="请输入自己的昵称"
                prefix-icon="el-icon-user-solid"
                v-model="name"
                style="width:50%"
            ></el-input>
            <el-button type="primary" @click="conectWebSocket()">建立连接</el-button>
            <el-button type="danger">断开连接</el-button>
          </el-row>
          <el-row>
            <el-input
                placeholder="请输入对方频道号"
                prefix-icon="el-icon-phone"
                v-model="aisle"
                style="width:40%"
            ></el-input>
          </el-row>
          <el-row>
            <el-input
                placeholder="请输入要发送的消息"
                prefix-icon="el-icon-s-promotion"
                v-model="messageValue"
                style="width:50%"
            ></el-input>
            <el-button type="primary" @click="sendMessage()">发送</el-button>
          </el-row>
          <div class="message">
            <div v-for="(value,key,index) in messageList" :key="index">
              <el-tag v-if="value.name==name" type="success" style="float:right">我:{{value.msg}}</el-tag>
              <br />
              <el-tag v-if="value.name!=name" style="float:left">{{value.name}}{{value.msg}}</el-tag>
              <br />
            </div>
          </div>
        </div>
      </el-col>
    </el-row>
  </div>
</template>

<script>
export default {
  data() {
    return {
      name: "", // 昵称
      websocket: null, // WebSocket对象
      aisle: "", // 对方频道号
      messageList: [], // 消息列表
      messageValue: "" // 消息内容
    };
  },
  methods: {
    conectWebSocket: function() {
        const url="ws://localhost:8080/websocket/";
      console.log("建立连接");
      if (this.name === "") {
        this.$alert("请输入自己的昵称", "提示", {
          confirmButtonText: "确定",
          callback: action => {}
        });
      } else {
        //判断当前浏览器是否支持WebSocket
        if ("WebSocket" in window) {
          this.websocket = new WebSocket(url + this.name);
        } else {
          alert("不支持建立socket连接");
        }
        //连接发生错误的回调方法
        this.websocket.onerror = function() {
            console.log("连接失败")
        };
        //连接成功建立的回调方法
        this.websocket.onopen = function(event) {
            console.log("连接成功")
        };
        //接收到消息的回调方法
        var that = this;
        this.websocket.onmessage = function(event) {
          var object = eval("(" + event.data + ")");
          console.log(object);
          if (object.type == 0) {
            // 提示连接成功
            console.log("连接成功");
            that.showInfo(object.people, object.aisle);
          }
          if (object.type == 1) {
            //显示消息
            console.log("接受消息");
            that.messageList.push(object);
          }
        };
        //连接关闭的回调方法
        this.websocket.onclose = function() {};
        //监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。
        window.onbeforeunload = function() {
          this.websocket.close();
        };
      }
    },
    // 发送消息
    sendMessage: function() {
      var socketMsg = { msg: this.messageValue, toUser: this.aisle };
      if (this.aisle == "") {
        //群聊.
        socketMsg.type = 0;
      } else {
        //单聊.
        socketMsg.type = 1;
      }
      this.websocket.send(JSON.stringify(socketMsg));
    },
    showInfo: function(people, aisle) {
      this.$notify({
        title: "当前在线人数:" + people,
        message: "您的频道号:" + aisle,
        duration: 0
      });
    }
  }
};
</script>

<style scoped>
.main {
  position: relative;
  top: 20px;
}
.message {
  position: relative;
  overflow:auto;
  top: 20px;
  width: 100%;
  height: 400px;
  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.12), 0 0 6px rgba(0, 0, 0, 0.04);
  padding: 5px;
}
</style>


运行结果及报错内容
failed: WebSocket opening handshake timed out

  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 系统已结题 6月29日
    • 创建了问题 6月21日

    悬赏问题

    • ¥15 bat批处理,关于数据复制问题
    • ¥50 同步两个不同结果的array中某些属性
    • ¥15 悬赏15远程操控解决问题
    • ¥15 CST复制的模型无法单独修改参数?
    • ¥15 前端页面想做个定时任务,但是使用requestAnimationFrame,setinterval和settimeout都不行
    • ¥15 根据以下文字信息,做EA模型图
    • ¥15 删除虚拟显示器驱动 删除所有 Xorg 配置文件 删除显示器缓存文件 重启系统 可是依旧无法退出虚拟显示器
    • ¥15 vscode程序一直报同样的错,如何解决?
    • ¥15 关于使用unity中遇到的问题
    • ¥15 开放世界如何写线性关卡的用例(类似原神)