1. 程式人生 > 實用技巧 >node-socket(即時通訊)實現簡易聊天室

node-socket(即時通訊)實現簡易聊天室

socket (套接字 包含資料內容) 實現網路通訊

網路上的兩個程式 通過一個雙向的通訊連線 實現資料的互動,這個連結的一端稱之為 socket

伺服器端 socket 功能

  • 1、建立 伺服器 繫結 IP + 埠 監聽埠
  • 2、監聽 客戶端的連結
  • 3、監聽 客戶端發來的訊息
  • 4、把來自客戶端的訊息 轉發給其他的線上客戶端
  • 5、監聽 客戶端的關閉

客戶端 socket 功能

  • 1、建立 客戶端 socket
  • 2、連線伺服器 的 socket
  • 3、傳送訊息 給 伺服器
  • 4、接收伺服器發來的訊息
  • 5、監聽 伺服器 關閉 或者 異常

雙向通訊 + 互相監聽

客戶端程式碼

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>聊天室</title>
    <style>
        .box {
            width: 500px;
            height: 300px;
            margin: 0 auto;
            border: 1px #000 solid;
            overflow: auto;
        }
        #xx {
            text-align: center;
        }
    </style>
</head>
<body>
    <div class="box">

    </div>
    <div id="xx">
        <input type="text" name="" id="txt"><input type="button" value="傳送" id="btn">
    </div>
</body>
<script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js">
</script>
<script>
    var name = '卡卡西';
    var str = '';
    var scoket = new WebSocket('ws://192.168.53.212:10086');
    scoket.onopen = function () {
        scoket.send(`我是${name},我上線了`);
    }
    scoket.onmessage = function (message) {
        str = `<p>${message.data}</p>`;
        $('.box').html($('.box').html() + str)
    }
    // 監聽 伺服器端 關閉  
    scoket.onclose = function () {
        console.log("伺服器已經關閉停止服務...")
    }
    scoket.onerror = function () {
        console.log("伺服器被黑了...")
    }
    $('#btn').click(function () {
        scoket.send(`${name}說:` + $('#txt').val());
    })
</script>

</html>

服務端程式碼

const ws = require('ws');
const WebSocketServer = ws.Server;
// 1. 建立 socket 2. 監聽埠 
const wss = new WebSocketServer({
    port: 10086
});
var count = 100;
var info = "WUHAN2002__";
var obj = {};
// 3. 監聽客戶端的連結
wss.on('connection', function (ws) {
    // socket 客戶端連結 物件 socket 
    count++;
    ws.name = info + count;
    obj[ws.name] = ws;
    ws.on('message', function (message) {
        fn(message)
    })
    ws.on('close', function () {
        console.log(ws.name + '我下線了...');
        delete obj[ws.name];
        fn(ws.name + '我下線了...')
    })
});
function fn(message) {
    for (var i in obj) {
        obj[i].send(message);
    }
}