首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

读书笔记-《了不起的nodejs》-TCP

不能因一点成功或失败,就对自己肯定或否定,始终要对自己有清醒的认识

万古人间四月天,各位宝宝要在工作之余多去户外活动哦~

TCP

TCP是一个面向连接的协议,它保证了两台计算机之间数据传输的可靠性。如今的网络应用都是用TCP/IP协议进行通信的。

Node HTTP服务器是构建在Node TCP服务器之上的,也就是说node的http.Server继承自net.Server(net是TCP模块);所以了解TCP是非常有必要的。

TCP的特性:

面向连接的通信和保证顺序的传递:说到TCP,可以将客户端和服务端的通信看作是一个连接或者数据流;IP是基于数据包的传输,这些数据包是独立进行传输的,送达的顺序是无序的。为了解决这个问题TCP出现了,TCP连接内,发送的数据包包含了标记数据流顺序的信息。

面向字节:TCP对字符以及字符编码是完全无知的。

可靠性:TCP基于确认和超时一系列的机制来达到可靠

流控制:TCP通过流控制的方式确保两点之间传输数据的平衡

拥堵控制:TCP通过控制数据包的传输速率来避免拥堵

基于TCP的聊天程序

telnet是早期的网络协议,旨在提供双向的虚拟终端。它是TCP协议上层的协议。

?:做一个聊天应用

项目目录如下:

index.js文件内容如下:

代码语言:javascript
复制
var net = require('net');
var count = 0;
// 用户
var users={};


// 创建服务器,每次有新的连接建立时都会被执行
var server = net.createServer(function(conn){

    // tcp是面向字节的协议,若不进行编码,获得的客户端数据是个buffer,
    // 在这里我们只获取utf8的数据,所以通过net.Stream#setCncoding来设置编码
    conn.setEncoding('utf8');

    // 当有连接建立时在终端输出,并把连接数加一    
    conn.write(
        '\n > 欢迎来到 \033[90m node-chat \033[39m! '
        +'\n 现在还有'+count + '个别人在线'
        +'\n 请输入你的名字然后按回车键: '
    );
    count++;
    var nickName;
    
    // 监听客户端发来的数据
    conn.on('data',function(data){
        console.log(data);
        // 清楚按下回车的字符
        data = data.replace('\r\n','');
        // 在本次链接之后第一次输入nickname
        console.log("nickName",!nickName);
        if(!nickName){
            if(users[data]){
                conn.write('\033[96m> 用户名已存在请重试 \033[39m ');
            }else{
                // console.log('conn',conn);
                // 如果用户名还不存在
                nickName = data;
                users[nickName] = conn;
                for(var i in users){
                    users[i].write('\033[96m'+nickName +'\033[39m 进入聊天室\n' );
                }

            }
        }else{
            for(var i in users){
                // 给除去自己以外的人发送消息
                if(i!= nickName){
                    users[i].write('\033[96m'+nickName +':\033[39m '+data+'\n' );
                }
            }

        }
    })

    // 当有连接中断时连接数减一
    conn.on('close',function(){
        count--;
    })
})

server.listen(3000,function(){
    console.log('\033[90m server listening on *:3000 \033[39m ')
})

愿我们有能力不向生活缴械投降---Lin

举报
领券