WebSocket :实现聊天室功能

Vue2 的实现方法

<template>
  <div class="app">
    <ul>
      <li v-for="(item, index) in list" :key="index">
        <span>{{ item.user }}</span>
        <span>聊天信息:{{ item.msg }}</span>
      </li>
    </ul>
    <input type="text" v-model="username" placeholder="请输入用户名" />
    <input type="text" v-model="message" placeholder="请输入信息" />
    <button @click="sendmsg">点击发送</button>
  </div>
</template>

<script>
import axios from "axios";
export default {
  name: "app",
  data() {
    return {
      username: "",
      message: "",
      list: [],
      ws: "",
    };
  },
  mounted() {
    var this2 = this; //记录this指向
    this.ws = new WebSocket("ws:localhost:3000"); //和这个端口建立连接
    //监听
    this.ws.addEventListener(
      "open",
      function () {
        console.log("websocket建立连接");
      },
      false
    );
    //接收数据
    this.ws.addEventListener(
      "message",
      function (e) {
        console.log("接收数据");
        const message = JSON.parse(e.data)
        this2.list.push(message)
      },
      false
    );
  },
  methods: {
    sendmsg() {
      this.ws.send(
        JSON.stringify({
          user: this.username,
          msg: this.message,
        })
      );
    },
  },
};
</script>

React 的实现方法

import React from 'react';
class App extends React.Component {
  constructor(props) {
    super(props)
    this.state = {
      username: '',
      message: '',
      list: [],
      ws: ''
    }

  }
  componentDidMount() {
    var this2 = this
    this.ws = new WebSocket("ws:localhost:3000")
    this.ws.addEventListener(
      "open", function () {
        console.log("建立连接");
      }, false
    )
    //监听
    this.ws.addEventListener(
      "message", function (e) {
        console.log("接收数据");
        const message = JSON.parse(e.data)
        this2.setState({
          list: [...this2.state.list, message]
        })
      }
    )
  }
  //发送
  sendmsg = () => {
    this.ws.send(
      JSON.stringify({
        user: this.state.username,
        msg: this.state.message
      }))
  }
  //处理用户名函数
  inpFn1 = (e) => {
    this.setState({
      username: e.target.value
    })
  }
  //处理信息函数
  inpFn2 = (e) => {
    this.setState({
      message: e.target.value
    })
  }
  render() {
    return (
      <div>
        <ul>
          {
            this.state.list.map((item, index) => (
              <li key={index}>
                <span>{item.user}:</span>
                <span>{item.msg}</span>
              </li>
            ))
          }
        </ul>
        <input type="text" value={this.state.username} onChange={this.inpFn1} placeholder='请输入用户名' />
        <input type="text" value={this.state.message} onChange={this.inpFn2} placeholder='请输入信息' />
        <button onClick={this.sendmsg}>点击发送</button>
      </div>
    )
  }
}
export default App

后端接口:一定要同时开启前后端接口

// 第一步 先引入websocket的包
const Websocket = require('ws')
// 第二步 new 出来一个超能力的 wss    给它传入一个参数{port:3000}
var wss = new Websocket.Server({port:3000})
wss.on('connection', ws => {
  //服务器监听消息事件  on  监听客户端给服务端
  ws.on('message', msg => {
    console.log('服务器收到' ,msg)
    // websocketclients服务器 forEach 遍历此时链接的电脑 ,c=computer 
    wss.clients.forEach((c)=>{
      c.send(msg)
    })
    // ws.send(msg)
  })
  // send   服务端给客户端放
})
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值