Home > Web Front-end > JS Tutorial > How does node+vue implement a simple WebSocket chat function? (code example)

How does node+vue implement a simple WebSocket chat function? (code example)

青灯夜游
Release: 2020-11-17 18:09:15
forward
2472 people have browsed it

How does node+vue implement a simple WebSocket chat function? (code example)

Related recommendations: "node js tutorial"

I recently learned about websocket instant messaging and I feel it is very powerful. Here I used node to start a service for websocket link, and then linked it in the view of vue for communication. Without further ado, let’s go directly to the code.

First of all, I need to use node’s nodejs- websocket module

Use yarn to install

yarn add nodejs-websocket --save
Copy after login

Of course, you can also use npm to install

npm i nodejs-websocket --save
Copy after login

After the installation is completed, we start writing the server code. First, I use node has a node server locally to start the websocket service

sock.js:

let ws = require("nodejs-websocket");
console.log("开始建立链接");
ws.createServer(function (conn) {
  conn.on("text", function (str) {
    console.log("收到的信息为", str);
      conn.send(`${str}(机器人`)
  });
  conn.on("close", function (code, reason) {
    console.log("关闭连接")
  });
  conn.on("error", function (code, reason) {
    console.log("异常关闭")
  })
}).listen(8001);
console.log("链接建立完毕");
Copy after login

The server mainly uses nodejs-websocket to start the service and return the values ​​required by the front end. Here I just did a simple process, adding a 'robot' string after the acceptance value,

Then, we need to start the node service,

The path behind the command must be found correctly. I placed sock.js under the socket folder in the root directory.

Execute

yarn socket
Copy after login

Finally, look at our client. On the client side, I want to have an input box and then a chat box:

<template>
  <p class="test3">
    <p class="msg" ref="box">
      <p v-for="item in list" :class="[item.type,&#39;msg-item&#39;]">
        <p>
          {{item.content}}
        </p>
      </p>
    </p>
    <p class="input-group">
      <input type="text" v-model="contentText">
      <button @click="sendText">发送</button>
    </p>
  </p>
</template>

<script>
  export default {
    name: "index3",
    data() {
      return {
        list: [],//聊天记录的数组
        contentText: "",//input输入的值
      }
    },
    methods: {
      //发送聊天信息
       sendText() {
        let that = this;
        this.list = [...this.list, {type: "mine", content: this.contentText}];//通过type字段进行区分是自己(mine)发的还是系统(robot)返回的
        this.backText(function () {
          that.contentText = "";//加回调在得到返回数据的时候清除输入框的内容
        });
      },
      backText(callback) {
        let that = this;
        if (window.WebSocket) {
          let ws = new WebSocket("ws://192.168.11.169:8001");
          ws.onopen = function (e) {
            console.log("链接服务器成功");
            console.log("that.contentText is", that.contentText);
            ws.send(that.contentText);
            callback();
          };
          ws.onclose = function (e) {
            console.log("服务器关闭")
          };
          ws.onerror = function () {
            console.log("服务器出错")
          };
          ws.onmessage = function (e) {
            that.list = [...that.list, {type: "robot", content: e.data}]
          }
        }
      }
    },
    watch: {
      //监听list,当有修改的时候进行p的屏幕滚动,确保能看到最新的聊天
      list: function () {
        let that = this;
        setTimeout(() => {
          that.$refs.box.scrollTop = that.$refs.box.scrollHeight;
        }, 0);
        //加setTimeout的原因:由于vue采用虚拟dom,我每次生成新的消息时获取到的p的scrollHeight的值是生成新消息之前的值,所以造成每次都是最新的那条消息被隐藏掉了
      }
    },
    mounted() {
    }
  };


</script>

<style scoped lang="scss">
  .test3 {
    text-align: center;
  }

  .msg {
    width: 100px;
    height: 100px;
    overflow: auto;
    padding-top: 5px;
    border: 1px solid red;
    display: inline-block;
    margin-bottom: 6px;

    .msg-item {
      position: relative;
      overflow: hidden;
      p {
        display: inline-block;
        border-radius: 40px;
        background: #3C3D5A;
        color: white;
        float: left;
        padding: 2px 12px;
        margin: 0 0 2px 0;
        max-width: 70%;
        text-align: left;
        box-sizing: border-box;
      }

      &.mine {
        p {
          float: right;
          background: aquamarine;
          color: white;
        }
      }
    }
  }

</style>
Copy after login

Let’s take a look at the final effect:

Related Recommendation:

2020 Summary of front-end vue interview questions (with answers)

vue tutorial recommendation: The latest 5 vue.js in 2020 Video tutorial selection

For more programming-related knowledge, please visit: Programming Teaching! !

The above is the detailed content of How does node+vue implement a simple WebSocket chat function? (code example). For more information, please follow other related articles on the PHP Chinese website!

Related labels:
source:cnblogs.com
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template