Node.js學習之TCP聊天程序

創建一個基本的TCP服務器,任何人都可以連接到該服務器,無需實現任何協議或者指令:
1、成功連接到服務器後,服務器會顯示歡迎信息,並要求輸入用戶。同時顯示當前有多少個其他客戶端已經連接。
2、輸入用戶名,回車,確認連接。
3、連接好後,輸入信息回車,將信息向其他客戶端發送。

首先創建項目目錄:tcp-chat
在tcp-chat文件夾中,創建package.json文件

{
 "name" : "tcp-chat",
 "version" : "0.0.1",
 "description" : "Our first Tcp Server"
}

創建index.js文件

/* 模塊依賴 */
var net = require('net');

/* 追蹤用戶連接數 */
var count = 0;

/* 定義用戶 */
var users = {};

/* 創建服務器 */
var server = net.createServer(function(conn) {
    // 處理連接
    console.log('\033[90m net connection! \033[39m');

    // 處理編碼
    conn.setEncoding('UTF-8');

    // 代表當前鏈接的暱稱
    var nickname = null;

    // 向客戶端輸出信息
    conn.write(
        '\n > welcome to \033[90m node-chat \033[39m!'
      + '\n > ' + count + ' other people are connected at this time.'
      + '\n > please write your name and press enter: '
    );
    count++;

    // 監聽data事件
    conn.on('data', function(data) {
        // 刪除回車符
        data = data.replace('\r\n', '');
        // 接受用戶暱稱
        if (!nickname) {
            // 不允許暱稱重複
            if (users[data]) {
                conn.write('\033[93m nickname already in use. please try again: \033[39m');
                return;
            } else {
                nickname = data;
                users[nickname] = conn;
                for (var i in users) {
                    broadcast('\033[90m > ' + nickname + ' joined the room\033[39m\n');
                    // users[i].write('\033[90m > ' + nickname + ' joined the room\033[39m\n');
                }
            }
        } else {
            // 聊天信息
            for (var i in users) {
                // 發送信息給除自己之外的其他客戶端
                if (i != nickname) {
                    broadcast('\033[90m > ' + nickname + ' : \033[39m' + data + '\n');
                    // users[i].write('\033[90m > ' + nickname + ' : \033[39m' + data + '\n');
                }
            }
        }
        console.log(data);
    });

    // 當客戶端關閉,計數器變量遞減
    conn.on('close', function() {
        count--;
        // 客戶端關閉後,應該刪除用戶信息
        delete users[nickname];
        // 告訴其他客戶端,有客戶端退出
        broadcast('\033[90m > ' + nickname + ' left the room\033[39m\n')
    });
});

/* 監聽 */
server.listen(3000, function() {
    console.log('\033[96m server listening on *:3000 \033[39m');
});

/* 向用戶廣播信息 */
function broadcast(msg, exceptMyself) {
    for (var i in users) {
        if (!exceptMyself || i != nickname) {
            users[i].write(msg);
        }
    }
}

項目運行前再CMD輸入npm install ,添加項目需要的依賴;該項目沒有外部依賴,最好還是運行一下,養成習慣,避免後期麻煩。然後輸入node index.js 啓動項目。

這裏寫圖片描述

說明一下,我的系統是win10,telnet客戶端無法打開所以在CMD中打開bash方式使用telnet客戶端。win10中打開bash的方法請自行搜索。

這裏寫圖片描述

根據提示輸入用戶暱稱,並多啓動幾個客戶端即可測試項目。

注:以上內容爲學習筆記,摘自《了不起的Node.js》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章