读<了不起的Node.js>-08.TCP协议

2018-08-05  本文已影响0人  在路上的海贼

传输控制协议(TCP)

Node HTTP服务器是构构建于 Node TCP服务器之上的,编程角度解释就是node中得http.Server 继承自 net.Server(not是TCP模块)

TCP的特点

面向连接的通信和保证顺序的传递

面向字节

可靠性

流控制

拥堵控制

Telnet

require('http').createServer(function (req, res) {
    res.writeHeader(200, {'content-type': 'text/html'});
    res.end('<h1>Hello World</h1>')
}).listen(3000);

鉴于没有用telnet实验成功就直接用浏览器了- -!!!

基于Tcp的聊天程序

创建模块

理解NET.SERVER- API

const net = require('net');

/*
* 创建服务器
* */

let server = net.createServer(function (conn) {
    //处理连接
    console.log('\033[95m   新建连接!  \033[39m');
});

/*
* 监听
* */

server.listen(3000,function () {
    console.log('\033[96m 服务器端口:3000 \033[39m');
});

接收连接

let server = net.createServer(function (conn) {
    //处理连接
    console.log('\033[95m   新建连接!  \033[39m');
    conn.write(
        '\n > welcome to \033[95m   Node-Chat!  \033[39m' +
        '\n > '+count + 'other people are connected at this time' +
        '\n > please write your name and press enter'
    );
    count++;
});
- image.png - image.png

data事件

let server = net.createServer(function (conn) {
    //处理连接
    console.log('\033[95m   新建连接!  \033[39m');
    conn.write(
        '\n > welcome to \033[95m   Node-Chat!  \033[39m' +
        '\n > '+count + 'other people are connected at this time' +
        '\n > please write your name and press enter'
    );
    count++;
    conn.on('data',function (data) {
        console.log(data);
    });
    conn.on('close',function () {
        count--;
    })
});

状态以及记录连接的情况

const net = require('net');

/*
* 计数器
* */
let count = 0,users={};
/*
* 创建服务器
* */

let server = net.createServer(function (conn) {
    //对二进制进行转码
    conn.setEncoding('utf8');
    //设置当前连接昵称
    let nickname;

    //抽取方法
    function broadcast(msg, exceptMyself){
        for (let i in users){
            if (!exceptMyself || i!=nickname){
                users[i].write(msg);
            }
        }
    }

    //处理连接
    console.log('\033[95m   新建连接!  \033[39m');
    conn.write(
        '\n > welcome to    Node-Chat!  ' +
        '\n > '+count + '   other people are connected at this time' +
        '\n > please write your name and press enter: '
    );
    count++;
    conn.on('data',function (data) {
        //删除回车符
        data = data.replace('\r\n', '');
        //接收到的第一份数据应当是用户的昵称
        if (!nickname){
            if (users[data]){
                conn.write(' > nickname already in use,try again:');
                return;
            }else{
                nickname=data;
                users[nickname] = conn;
                // for (let i in users) {
                //     users[i].write(' > ' +nickname + 'joined the room!! \n')
                // }
                broadcast(''+nickname+'joined the room! \n');
            }
        }else{
            //视为聊天记录
            // for (let i in users){
                //这里用来确保消息只发送给除了自己以外的其他客户端
                // if (i != nickname){
                //     users[i].write(' > ' + nickname + ':' + data + '\n');
                // }
                broadcast(nickname + ': ' + data+'\n', true);
            // }
        }
    });



    conn.on('close',function () {
        count--;
        //当有人离开时我们需要清除users数组中对应的元素
        delete users[nickname]
        broadcast('' + nickname + 'left the room! \n');
    })
});

/*
* 监听
* */

server.listen(23,function () {
    console.log('\033[96m 服务器端口:3000 \033[39m');
});


能力不足,还得再看看

上一篇 下一篇

猜你喜欢

热点阅读