Vue+Websocket implementiert einfach die Chat-Funktion

Vue+Websocket implementiert einfach die Chat-Funktion

In diesem Artikel wird der spezifische Code von Vue + Websocket zur einfachen Implementierung der Chat-Funktion zu Ihrer Information geteilt. Der spezifische Inhalt ist wie folgt

Effektbild:

Chatraum

In diesem Artikel geht es um ein einfaches Verständnis und die Anwendung von Websocket , das durch den einfachen Aufbau eines Servers mit Nodejs implementiert wird.

Erstellen Sie zuerst ein Vue -Projekt

Erstellen Sie dann einen Serverordner , öffnen Sie den Ordner auf dem Terminal, geben Sie vue init ein (halten Sie die Eingabetaste gedrückt) und erstellen Sie schließlich eine Datei server.js , wie unten gezeigt

Der Code lautet wie folgt:

server.js /

Führen Sie im Serverdateiterminal npm install --s ws aus.

var userNum = 0; //Anzahl der Online-Benutzer zählen var chatList = []; //Chatverlauf aufzeichnen var WebSocketServer = require('ws').Server;
wss = new WebSocketServer({ port: 8181 }); //8181 entspricht dem Front-End //Rufen Sie Broadcast auf, um Datenkommunikation und Echtzeit-Update zu erreichen wss.broadcast = function (msg) {
    wss.clients.forEach(Funktion each(Client) {
        client.send(msg);
    });
};
wss.on('Verbindung', Funktion (ws) {
    userNum++; //Verbindung erfolgreich hergestellt, Anzahl der Personen online +1
    wss.broadcast(JSON.stringify({ funName: 'userCount', users: userNum, chat: chatList })); //Bei erfolgreicher Verbindung wird die Anzahl der Personen gesendet, die derzeit online sind. console.log('Verbundene Clients:', userNum);
    //Vom Frontend gesendete Daten empfangen ws.on('message', function (e) {
        var resData = JSON.parse(e)
        console.log('Nachricht vom Client erhalten:' + resData.msg)
        chatList.push({ userId: resData.userId, content: resData.msg }); //Jedes Mal, wenn eine Nachricht gesendet wird, wird sie gespeichert und dann gesendet, sodass jeder eingehende Benutzer die vorherigen Daten sehen kann wss.broadcast(JSON.stringify({ userId: resData.userId, msg: resData.msg })); //Jede gesendete Nachricht entspricht dem Senden einer Nachricht });
    ws.on('schließen', Funktion (e) {
        userNum--; //Verbindung herstellen und Anzahl der Online-Personen schließen - 1
        wss.broadcast(JSON.stringify({ funName: 'userCount', users: userNum, chat: chatList })); //Verbindung herstellen und Broadcast einmal schließen. Aktuelle Anzahl der Online-Clients console.log('Verbundene Clients:', userNum);
        console.log('Lange Verbindung geschlossen')
    })
})
console.log('Server erfolgreich erstellt')

Dann npm run start um den Server zu starten

HelloWorld.vue (Front-End-Seite)

<Vorlage>
  <div Klasse="Chatbox">
    <header>Anzahl der Personen im Chatroom: {{count}}</header>
    <div Klasse="msg-box" ref="msg-box">
      <div
        v-for="(i,index) in Liste"
        :Schlüssel="Index"
        Klasse="Nachricht"
        :style="i.userId == Benutzer-Id?'flex-direction:row-reverse':''"
      >
        <div Klasse="Benutzerkopf">
          <div
            Klasse="Kopf"
            :style="`Hintergrund: hsl(${getUserHead(i.userId,'bck')}, 88%, 62%); Clip-Pfad: Polygon(${getUserHead(i.userId,'polygon')}% 0,100% 100%,0% 100%); Transformieren: Drehen(${getUserHead(i.userId,'rotate')}Grad)`"
          ></div>
        </div>
        <div Klasse="Benutzernachricht">
          <span
            :style="i.userId == Benutzer-ID?' float: right;':''"
            :Klasse="i.userId == Benutzer-ID?'rechts':'links'"
          >{{i.inhalt}}</span>
        </div>
      </div>
    </div>
    <div Klasse="Eingabefeld">
      <input type="text" ref="sendMsg" v-model="contentText" @keyup.enter="sendText()" />
      <div class="btn" :class="{['btn-active']:contentText}" @click="sendText()">Senden</div>
    </div>
  </div>
</Vorlage>
 
<Skript>
Standard exportieren {
  Daten() {
    zurückkehren {
      ws: null,
      Anzahl: 0,
      userId: null, //Aktuelle Benutzer-ID
      Liste: [], //Array von Chat-Aufzeichnungen contentText: "" //Eingabewert};
  },
  erstellt() {
    dies.getUserID();
  },
  montiert() {
    dies.initWebSocket();
  },
  Methoden: {
    //Verwende den Zeitstempel als aktuelle Benutzer-ID
    getUserID() {
      let Zeit = neues Date().getTime();
      diese.userId = Zeit;
    },
    //Erstelle einen zufälligen Avatar basierend auf der Benutzer-ID getUserHead(id, type) {
      sei ID = String(id);
      wenn (Typ == "bck") {
        gibt Nummer zurück (ID.Teilzeichenfolge (ID.Länge - 3));
      }
      wenn (Typ == "Polygon") {
        gibt Nummer zurück (ID.Teilzeichenfolge (ID.Länge - 2));
      }
      wenn (Typ == "rotieren") {
        gibt Nummer zurück (ID.Teilzeichenfolge (ID.Länge - 3));
      }
    },
    //Leiste nach unten scrollen scrollBottm() {
      Lassen Sie el = dies.$refs["msg-box"];
      el.scrollTop = el.scrollHeight;
    },
    //Chatnachricht senden sendText() {
      lass _this = dies;
      _this.$refs["sendMsg"].focus();
      wenn (!_dieser.Inhaltstext) {
        zurückkehren;
      }
      let Parameter = {
        Benutzer-ID: _this.userId,
        Nachricht: _dieser.Inhaltstext
      };
      _this.ws.send(JSON.stringify(params)); //Rufen Sie WebSocket send() auf, um Informationen zu senden _this.contentText = "";
      setzeTimeout(() => {
        _this.scrollBottm();
      }, 500);
    },
    //Gehe zur Seite, um eine WebSocket-Verbindung herzustellen initWebSocket() {
      lass _this = dies;
      //Beurteilen Sie, ob auf der Seite eine WebSocket-Verbindung besteht, if (window.WebSocket) {
        // 192.168.0.115 ist meine lokale IP-Adresse. Hier sollte die Portnummer mit der Backend-Konfiguration übereinstimmen. let ws = new WebSocket("ws://192.168.0.115:8181");
        _diese.ws = ws;
        ws.onopen = Funktion(e) {
          console.log("Serververbindung erfolgreich");
        };
        ws.onclose = Funktion(e) {
          console.log("Serververbindung geschlossen");
        };
        ws.onerror = Funktion() {
          console.log("Serververbindungsfehler");
        };
        ws.onmessage = Funktion(e) {
          //Vom Server zurückgegebene Daten empfangen let resData = JSON.parse(e.data);
          if (resData.funName == "Benutzeranzahl") {
            _this.count = resData.Benutzer;
            _this.list = resData.chat;
            Konsole.log(resData.chat);
          } anders {
            _diese.liste = [
              ..._diese.Liste,
              { Benutzer-ID: resData.Benutzer-ID, Inhalt: resData.msg }
            ];
          }
        };
      }
    }
  }
};
</Skript>
 
<style lang="scss" scoped>
.chat-box {
  Rand: 0 automatisch;
  Hintergrund: #fafafa;
  Position: absolut;
  Höhe: 100%;
  Breite: 100 %;
  maximale Breite: 700px;
  Kopfzeile {
    Position: fest;
    Breite: 100 %;
    Höhe: 3rem;
    Hintergrund: #409eff;
    maximale Breite: 700px;
    Anzeige: Flex;
    Inhalt ausrichten: zentriert;
    Elemente ausrichten: zentrieren;
    Schriftstärke: fett;
    Farbe: weiß;
    Schriftgröße: 1rem;
  }
  .msg-box {
    Position: absolut;
    Höhe: berechnet (100 % – 6,5 rem);
    Breite: 100 %;
    Rand oben: 3rem;
    Überlauf-y: scrollen;
    .msg {
      Breite: 95 %;
      Mindesthöhe: 2,5 rem;
      Rand: 1rem 0,5rem;
      Position: relativ;
      Anzeige: Flex;
      Inhalt begründen: Flex-Start !wichtig;
      .Benutzerkopf {
        Mindestbreite: 2,5 rem;
        Breite: 20 %;
        Breite: 2,5rem;
        Höhe: 2,5rem;
        Randradius: 50 %;
        Hintergrund: #f1f1f1;
        Anzeige: Flex;
        Inhalt ausrichten: zentriert;
        Elemente ausrichten: zentrieren;
        .Kopf {
          Breite: 1,2rem;
          Höhe: 1,2rem;
        }
        // Position: absolut;
      }
      .Benutzernachricht {
        Breite: 80%;
        // Position: absolut;
        Wörtertrennung: alles trennen;
        Position: relativ;
        Z-Index: 5;
        Spanne {
          Anzeige: Inline-Block;
          Polsterung: 0,5rem 0,7rem;
          Randradius: 0,5rem;
          Rand oben: 0,2rem;
          Schriftgröße: 0,88rem;
        }
        .links {
          Hintergrund: weiß;
          Animation: nach links 0,5 s, beide 1;
        }
        .Rechts {
          Hintergrund: #53a8ff;
          Farbe: weiß;
          Animation: nach rechts 0,5 s Pause, beide 1;
        }
        @keyframes nach links {
          0% {
            Deckkraft: 0;
            transformieren: übersetzenX(-10px);
          }
          100 % {
            Deckkraft: 1;
            transformieren: übersetzenX(0px);
          }
        }
        @keyframes nach rechts {
          0% {
            Deckkraft: 0;
            transformieren: übersetzenX(10px);
          }
          100 % {
            Deckkraft: 1;
            transformieren: übersetzenX(0px);
          }
        }
      }
    }
  }
  .Eingabefeld {
    Polsterung: 0 0,5rem;
    Position: absolut;
    unten: 0;
    Breite: 100 %;
    Höhe: 3,5rem;
    Hintergrund: #fafafa;
    Kastenschatten: 0 0 5px #ccc;
    Anzeige: Flex;
    Inhalt ausrichten: Abstand dazwischen;
    Elemente ausrichten: zentrieren;
    Eingabe {
      Höhe: 2,3rem;
      Anzeige: Inline-Block;
      Breite: 100 %;
      Polsterung: 0,5rem;
      Rand: keiner;
      Randradius: 0,2rem;
      Schriftgröße: 0,88rem;
    }
    .btn {
      Höhe: 2,3rem;
      Mindestbreite: 4rem;
      Hintergrund: #e0e0e0;
      Polsterung: 0,5rem;
      Schriftgröße: 0,88rem;
      Farbe: weiß;
      Textausrichtung: zentriert;
      Randradius: 0,2rem;
      Rand links: 0,5rem;
      Übergang: 0,5 s;
    }
    .btn-aktiv {
      Hintergrund: #409eff;
    }
  }
}
</Stil>

192.168.0.115 ist meine lokale IP-Adresse (die Standardeinstellung ist localhost), Sie können sie in Ihre eigene ändern

Führen Sie dann npm run dev aus und Sie können im LAN chatten. Wenn Sie über WLAN verfügen, können Sie sich mit Ihrem Mobiltelefon mit dem WLAN verbinden und auf Ihre IP-Adresse zugreifen. Wenn nicht, können Sie versuchen, ein paar weitere Fenster zu öffnen und den Effekt zu sehen! !

Der Server druckt Protokolle aus, wenn Sie einen Chatraum betreten und Nachrichten senden

Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, er wird für jedermanns Studium hilfreich sein. Ich hoffe auch, dass jeder 123WORDPRESS.COM unterstützen wird.

Das könnte Sie auch interessieren:
  • Vue verwendet WebSocket, um die Chat-Funktion zu simulieren
  • Websocket+Vuex implementiert eine Echtzeit-Chat-Software
  • Vue + WebSocket + WaveSurferJS zur Implementierung eines H5-Chat-Dialoginteraktionsbeispiels
  • Implementierung einer einfachen WebSocket-Chat-Funktion basierend auf Node+Vue
  • Mehrpersonen-Online-Chatroom basierend auf Vue und WebSocket
  • Das Vue + Webterminal imitiert die Chatroom-Funktion der WeChat-Webversion
  • Vue.js imitiert das WeChat-Chatfenster, um Komponentenfunktionen anzuzeigen
  • Vue + socket.io implementiert einen einfachen Chatroom-Beispielcode
  • Vue implementiert WebSocket-Kundendienst-Chatfunktion

<<:  Lösen Sie das Problem, dass PhpStorm keine Verbindung zu VirtualBox herstellen kann

>>:  Beispielanalyse des Prinzips der MySQL-Transaktionsisolationsebene

Artikel empfehlen

Detaillierte Beispiele für Ersetzen und Ersetzen in MySQL into_Mysql

„Replace“ und „Replace into“ von MySQL sind beide...

Detaillierte Erklärung des Prinzips des js-Proxys

Inhaltsverzeichnis Was ist der Proxy-Modus? Einfü...

Detailliertes Tutorial zum Bereitstellen von Jenkins basierend auf Docker

0. Als ich dieses Dokument erstellte, war es unge...

36 Prinzipien der MySQL-Datenbankentwicklung (Zusammenfassung)

Vorwort Diese Prinzipien sind aus tatsächlichen K...

Detaillierte Beispiele zur Verwendung der Box-Shadow-Eigenschaft in CSS3

CSS enthält viele Attribute. Manche Attribute wer...

Fallstudie zu JavaScript Anti-Shake

Prinzip Das Prinzip von Anti-Shake ist: Du kannst...

Detaillierte Erklärung des VUE-Reaktionsprinzips

Inhaltsverzeichnis 1. Grundlage des Responsive-Pr...

Standards zum Schreiben von Codekommentaren bei der Webseitenerstellung

<br />Ich habe die in meiner Arbeit verwende...

Eine kurze Diskussion über die binäre Familie von JS

Inhaltsverzeichnis Überblick Klecks Blob in Aktio...

CentOS 7.x-Bereitstellung von Master- und Slave-DNS-Servern

1. Vorbereitung Beispiel: Zwei Maschinen: 192.168...

Detaillierte Erläuterung der Docker Volume-Berechtigungsverwaltung

Das Datenvolumen ist ein wichtiges Konzept von Do...