Socket 聊天伺服器

今天是线上教学的第二天

家里冷气好舒服

新增一个资料夹并且在该资料夹开启 VScode

新增一个档案 tcp_chatserver.js 并且贴上以下程式码

// Load the TCP Library
net = require('net');

// Keep track of the chat clients
var clients = [];

// Start a TCP Server
net.createServer((socket) => {

    // Identify this client
    socket.name = socket.remoteAddress + ":" + socket.remotePort

    // Put this new client in the list
    clients.push(socket);

    // Send a nice welcome message and announce
    socket.write("Welcome " + socket.name + "\n");
    broadcast(socket.name + " joined the chat\n", socket);

    // Handle incoming messages from clients.
    socket.on('data', function (data) {
        var index = data.indexOf('/nickname ')
        if (index != -1) {
            this.name = data.slice(index + 10).toString();
            return;
        }
        var index = data.indexOf('/msg ')
        if (index != -1) {
            var res = data.toString().split(" ");
            var name = res[1];
            var msg = res[2];
            privateMessage(msg, name.toString());
            return;
        }
        broadcast(socket.name + "> " + data, socket);
    });

    // Remove the client from the list when it leaves
    socket.on('end', function () {
        clients.splice(clients.indexOf(socket), 1);
        broadcast(socket.name + " left the chat.\n");
    });
    function privateMessage(message, receiver_name) {
        clients.forEach(function (client) {
            // Don't want to send it to sender
            if (client.name === receiver_name) {
                client.write(message);
            }
        });
    }
    // Send a message to all clients
    function broadcast(message, sender) {
        clients.forEach(function (client) {
            // Don't want to send it to sender
            if (client === sender) return;
            client.write(message);
        });
        // Log it to the server output too
        process.stdout.write(message)
    }

}).listen(5000);

// Put a friendly message on the terminal of the server.
console.log("Chat server running at port 5000\n");

新增一个档案 tcpClient.js 并且贴上以下程式码

const net = require('net');
const { exit } = require('process');

const readline = require('readline');
const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});

const client = net.createConnection({ port: 5000 }, () => {
    // 'connect' listener.
    console.log('connected to server!');

});

client.on('data', (msg) => {
    console.log(`Client Received: ${msg}`);
})

console.log('Please Input your data:')
rl.on('line', (input) => {
    // console.log(`Received: ${input}`);
    if (input == 'exit') {
        client.end();
        exit();
    }
    client.write(input);
});

client.on('end', () => {
    console.log('disconnected from server');
});

好了之后首先在终端机执行 tcp_chatserver.js

node tcp_chatserver.js

之后再开启三个终端机,都执行 client 端

node tcpClient.js

再来这三个聊天室就可以互相聊天

为伺服器加上暱称 (Nickname)

开启聊天室之后,客户端可以设定自己的暱称

在聊天室A输入以下的指令变更暱称

/nickname Tommy

之后再次输入讯息并查看其他聊天室,可以发现暱称变成 Tommy

更改所有人的暱称并且测试

传送私讯给其他聊天室

之后就可以传送私讯给其他人

在聊天室A输入以下的指令传送讯息给聊天室B(Mary)

/msg Mary helloMary

试着用 John 传送讯息给 Mary 告白

/msg Mary 我喜欢你,请跟我交往!

SHXJ
Latest posts by SHXJ (see all)

发布留言