利用node之socket搭建简单聊天室

本文介绍如何使用Node.js实现客户端与服务器之间的Socket通信,包括创建服务器和客户端的基本步骤、消息的发送与接收,以及如何实现广播功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、理解socket

socket是client和server进行连接,消息传送的桥梁;

这里写图片描述


二、 node中server的socket

node通过net.createServer((socket) => {})创建server,其中回调函数的参数为socket,建立连接后即可使用socket;

const net = require('net');

//创建一个socket服务器
const server = net.createServer((socket) => {
    // 建立连接后触发以下程序
    console.log('建立连接');
    socket.write('hello client');

    socket.on('data', (data) => {
        console.log(data.toString());
    })
    socket.on('end', () => {
        console.log('连接中断');
    })
});

server.on('error', (err) => {
    throw err;
})

server.listen(2080, '127.0.0.1', () => {
    console.log('server监听成功');
})



三、node中client的socket

client通过net.createConnection({port: 2080, host: ‘127.0.0.1’}, () => {});创建client,这个client就是socket

const net = require('net');

const client = net.createConnection({port: 2080, host: '127.0.0.1'}, () => {
   // 客户端创建连接之后触发
    console.log('客户端连接成功');
    // 通过socket给server发送消息
    client.write('hello server');
})

client.on('data', (data) => {
    // 通过socket接受server的消息
    console.log(data.toString());
    client.end();
})
client.on('end', () => {
    console.log('连接中断');
})


四、在shell中使用

这里写图片描述
这里写图片描述



五、server端进行广播(http协议雏形)

思路:1、定义数据格式,利用json字符串进行传递;
对于多个客户端,用数组sockets剩放所有client连接;
在server.js中:

const net = require('net');

//存储所有连接的client
const sockets = [];

// 创建一个socket服务器
const server = net.createServer((socket) => {
   sockets.push(socket);
   function boardcast(from, message){
       sockets.forEach((element) => {
           element.write(`你好呀${from}, 你说的是${message}`);
       });
   }

    socket.on('data', (chunk) => {
        //规定chunk的数据结构为: {portocal: 'boardcast', from: 'client', message: 'hello'}
        try {
            var data = JSON.parse(chunk);
            switch(data.portocal){
                case 'boardcast': 
                console.log('收到消息');
                boardcast(data.from, data.message);// 有任何客户端发消息都会有触发,对每个client进行广播
                break;
                default:  socket.write('你说的格式我不识别');
            }
        } catch (error) {
            console.log(error);
        }    
    })
});

const port = 2080;

// 监听一个特定的端口
server.listen(port, (err) => {
    // 监听端口成功后调用,如果监听失败则是端口被调用
    if (err){
        console.log('端口被占用');
        return false;
    }
    console.log(`server成功监听${port}`);
})

在client.js中

const net = require('net');

const signal = {"portocal": "boardcast", "from": "jinghong", "message": "hello"};

const client = net.createConnection({port: 2080, host: '127.0.0.1'}, () => {
    console.log('client已经连接');
    client.write(JSON.stringify(signal));
});

client.on('data', (data) => {
   console.log(data.toString());
})
client.on('end', () => {
    console.log('连接关闭');
})

运行测试:打开一个终端运行server.js;多个终端运行client;

这里写图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值