websocket實現簡單聊天程式

来源:http://www.cnblogs.com/fanwalker/archive/2017/09/12/7510966.html
-Advertisement-
Play Games

程式的流程圖: 主要代碼: 服務端 app.js 先載入所需要的通信模塊: 創建用戶列表和消息列表: 綁定並監聽80埠: 客戶端連接成功後,觸發響應事件connection,完成要綁定的事件並實現客戶端出發的事件: 客戶端 index.js: 先初始化用戶信息: 然後連接伺服器端: 連接成功後,對 ...


程式的流程圖:

主要代碼:

服務端 app.js

先載入所需要的通信模塊:

var express = require('express');
var app = express();
var http = require('http').createServer(app);
var io = require('socket.io').listen(http);
var fs = require('fs');

創建用戶列表和消息列表:

var person = [];
var history = [];

綁定並監聽80埠:

app.get('/',function (req,res) {
    res.sendFile(__dirname + '/login.html');
});

http.listen(80,function () {
    console.log('listening on *:80');
});

客戶端連接成功後,觸發響應事件connection,完成要綁定的事件並實現客戶端出發的事件:

io.sockets.on('connection',function (socket) {
    var user = '';

    socket.emit('history', history);
    io.sockets.emit('updatePerson', person); 

    socket.on('sendMsg', function (data) {
        var obj = {};
        obj.content = data;
        obj.time = now();
        obj.name = user;
        if (history.length === history_num) {
            history.shift();
        }
        history.push(obj);
        io.sockets.emit('news', obj);
    });

    socket.on('setUserName', function (data) {
        user = data;
        person.push(user);
        io.sockets.emit('loginsucess');
        io.sockets.emit('updatePerson', person);
        io.sockets.emit('news', {content: user + '進入房間', time: now(), name: '系統消息'});
    });

    socket.on('disconnect', function () {
        if (user !== '') {
            person.forEach(function (value, index) {
                if (value === user) {
                    person.splice(index, 1);
                }
            });
            io.sockets.emit('news', {content: user + '離開房間', time: now(), name: '系統消息'});
            io.sockets.emit('updatePerson', person);
        }
    });
});

客戶端 index.js:

先初始化用戶信息:

 $scope.data = [];     //消息隊列  
 $scope.name = '';    //用戶名
 $scope.content = '';  //用戶輸入的消息
 $scope.personlist = []; //用戶隊列

然後連接伺服器端:

const  socket_url = 'http://localhost';
var socket = io.connect(socket_url);

連接成功後,對用戶昵稱輸入的驗證:

$scope.checkName = function () {
    if($scope.name!==''){
        if($scope.personlist.length!==0){
            if($scope.personlist.indexOf($scope.name)>-1) {
                document.getElementById("info").textContent = "該昵稱已被占用,請重新輸入";
            }
            else{
                socket.emit('setUserName', $scope.name);
            }
        }
        else{
            socket.emit('setUserName', $scope.name);
        }
    }
    else{
        document.getElementById('name').focus();
    }
};

驗證成功後,對用戶輸入消息要觸發的事件:

$scope.sendMsg = function(data){
    var date = new Date();
    data = $scope.content;
    if($scope.content !== ''){
        socket.emit('sendMsg',data);
    }
    $scope.content = '';
};

程式的部分運行測試結果:

瀏覽器輸入localhost後展示的用戶登錄界面:

昵稱重覆後的提示:

昵稱輸入成功後進入當前用戶的聊天界面:

 

源碼地址:github

參考學習:

Node.js + Web Socket 打造即時聊天程式嗨聊

基於websocket的一個簡單的聊天室


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 冒泡排序在面試中遇到的概率也是很大的。 什麼是冒泡排序呢? 其原理就是依次比較相鄰的兩個值,如果後面的比前面的小,則將小的排到前面。依照這個規則進行多次並且遞減的迭代,直到順序正確。 請看下麵引用網上的動態圖可以更直觀的瞭解冒泡排序的一個工作原理: 請看下麵的代碼是如何實現的冒泡排序: 解析:使用兩 ...
  • 一,TypeScript多行字元串 傳統JavaScript字元串換行需要+進行拼接,而TypeScript不需要+拼接。看下麵實例: javaScript: var content = "aaa"+ "bbbb"; TypeScript: var content = `aaa bbb`; (註意這 ...
  • [1]條紋背景 [2]網格背景 [3]波點背景 [4]棋盤背景 [5]偽隨機背景 [6]斑馬線背景 ...
  • [1]半透明邊框 [2]縫邊效果 [3]邊框內圓角 [4]信封邊框 [5]腳註效果 [6]螞蟻線 ...
  • 一、現象: 當本地同時運行了多個angular項目時,埠占用問題 Port 4200 is already in use. Use '--port' to specify a different port. 二、解決: 1、相應找到以下目錄 node_modules/@angular/cli/li ...
  • 父頁面: 子頁面: ...
  • 上篇博文【 Js利用Canvas實現圖片壓縮 】中做了圖片壓縮上傳,但是在IOS真機測試的時候,發現圖片預覽的時候自動逆時針旋轉了90度。對於這個bug,我完全不知道問題出在哪裡,接下來就是面向百度編程了。通過度娘找到了相關資料,解決方法記錄在此。這個問題的具體因素其實我還是不清楚是為何導致的,只有 ...
  • 從廣義上來講,css3動畫可以分為兩種。 過渡動畫 第一種叫過渡(transition)動畫,就是從初始狀態過渡到結束狀態這個過程中所產生的動畫。所謂的狀態就是指大小、位置、顏色、變形(transform)等等這些屬性。css過渡只能定義首和尾兩個狀態,所以是最簡單的一種動畫。要想使一個元素產生過渡 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...