WebSocket入门

WebSocket 是 HTML5 最先供应的一种在单个 TCP 衔接上举行全双工通信的协定。

WebSocket 使得客户端和服务器之间的数据交流变得越发简朴,许可服务端主意向客户端推送数据。在 WebSocket API 中,浏览器和服务器只须要完成一次握手,两者之间就直接可以竖立持久性的衔接,并举行双向数据传输

如今,许多网站为了完成推送手艺,所用的手艺都是 Ajax 轮询。轮询是在特定的的时候距离(如每1秒),由浏览器对服务器发出HTTP要求,然后由服务器返回最新的数据给客户端的浏览器。这类传统的形式带来很明显的瑕玷,即浏览器须要不停的向服务器发出要求,但是HTTP要求可以包括较长的头部,个中真正有用的数据可以只是很小的一部分,明显如许会糟蹋许多的带宽等资本。

HTML5 定义的 WebSocket 协定,能更好的节约服务器资本和带宽,而且可以更及时地举行通信。

浏览器经由过程 JavaScript 向服务器发出竖立 WebSocket 衔接的要求,衔接竖立今后,客户端和服务器端就可以经由过程 TCP 衔接直接交流数据。

当你猎取 Web Socket 衔接后,你可以经由过程 send() 要领来向服务器发送数据,并经由过程 onmessage 事宜来接收服务器返回的数据。

DEMO以下

// client side file

let socket = new WebSocket('ws://localhost:9999');

// 当衔接胜利实行回调函数
socket.onopen = function () {
  console.log('客户端衔接胜利');
  
  // 向服务器发送一个音讯
  socket.send('这是客户端发给服务器的音讯');
}

// 绑定事宜是用加属性的体式格局
socket.onmessage = function (res) {
  console.log('收到服务器端的响应是', res);
}
// server side file
/* npm i ws -S */
/* 用ws模块启动一个websocket服务器,监听 9999 端口 */
let WebSocketServer = require('ws').Server; 
let wsServer = new WebSocketServer({port: 9999});

wsServer.on('connection', socket=>{
    console.log('服务器衔接胜利');
    socket.on('message', msg=>{
        console.log('从客户端接收到的信息为'+msg);
        socket.send('这是从服务器发送到客服端的信息');
    })
})

简朴模仿智能客服谈天

<template>
  <div class="wrap">
    <ul>
      <li v-for="(item, index) in dialogs" :key="index">
        <p :class="item.self ? 'fr': 'fl'">{{item.sendContent || item.acceptContent}}</p>
      </li>
    </ul>
    <div class="send-cont">
      <input v-model="sendCont">
      <input type="button" @click="send" value="发送">
    </div>
  </div>
</template>

<script>
let socket = new WebSocket("ws://localhost:9999");
export default {
  data() {
    return {
      dialogs: [],
      sendCont: "",
      isConnect: false
    };
  },
  mounted() {
    socket.onopen = () => {
      this.isConnect = true;
    };
  },
  methods: {
    send() {
      if (this.isConnect) {
        console.log("客户端衔接胜利");
        // 向服务器发送一个音讯
        socket.send(this.sendCont);
        this.dialogs.push({ sendContent: this.sendCont, self: true });
        // 绑定事宜是用加属性的体式格局
        socket.onmessage = res => {
          setTimeout(() => {
            this.dialogs.push({ acceptContent: res.data });
          }, Math.random() * 2000);
        };
      }
    }
  }
};
</script>

<style scoped>
* {
  padding: 0;
  margin: 0;
}
.fl {
  float: left;
}
.fr {
  float: right;
}
li::before {
  content: ".";
  display: block;
  height: 0;
  clear: both;
  visibility: hidden;
}

.wrap {
  position: relative;
  width: 380px;
  margin: auto;
  height: 600px;
  background-color: #eee;
  padding: 10px;
}
.wrap ul {
  overflow: auto;
  height: 550px;
}
li {
  list-style: none;
  margin: 2px;
}
li:nth-child(even) p {
  background-color: rgb(86, 107, 177);
}
li p {
  font-size: 20px;
  font-family: "Microsoft Yahei", serif, Arial, Helvetica, sans-serif;
  border-radius: 6px;
  padding: 4px;
  margin: 2px 4px;
  white-space: wrap;
  text-align: left;
}
li p.fr {
  background-color: rgb(61, 185, 30);
}

.send-cont {
  position: absolute;
  bottom: 10px;
  z-index: 999;
  width: 98%;
  margin: auto;
}
.send-cont input {
  display: inline-block;
  outline: none;
  border: 2px solid #080;
  border-radius: 6px;
  line-height: 30px;
  font-size: 16px;
  text-align: left;
}
.send-cont input:first-child {
  width: 70%;
}
.send-cont input[type="button"] {
  width: 20%;
  background-color: #080;
  color: #fff;
  text-align: center;
  padding: 1px;
}
</style>
const contents = ['你好', 'hi', 'hello', 'nice to meet you', 'how are you', 'how do you do']

let WebSocketServer = require('ws').Server; 
let wsServer = new WebSocketServer({port: 9999});

wsServer.on('connection', socket=>{
    console.log('服务器衔接胜利');
    socket.on('message', msg=>{
        console.log('从客户端接收到的信息为'+msg);
        socket.send(contents[parseInt(Math.random()*contents.length)]);
    })
})
    原文作者:落霞与孤鹜齐飞
    原文地址: https://segmentfault.com/a/1190000018708634
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞