读书笔记-《了不起的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文件内容如下:

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

本文分享自微信公众号 - 女程序员的日常(gh_df41d619fb70)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-04-16

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏web前端教室

前端妹子要十几K工资,老鸟反而不敢提高薪?

现在前端开发新人的简历、学历中的水份非常大。具体表现,能力和学历不符。硕士毕业,但因为是转行而来的,所以计算机、前端的相关基础知识很差,所以就在技能方面注水;2...

18520
来自专栏前端迷

JavaScript 中的异步:Event Loop 及其他

简单地说,JavaScript 是单线程执行的语言,但在使用中有很多异步执行的情况。异步的本质是用其他方式(相对同步)控制程序的执行顺序,这与其他语言中的多线程...

9440
来自专栏编程坑太多

「实战篇」开源项目docker化运维部署-redis高速缓存(六)

!/upload-images.jianshu.io/upload_images/11223715-0123418e8224c25c.png?imageMogr...

11230
来自专栏JavaEdge

突破Java面试(23-4) - 再深入Redis Replication的完整执行流程及原理

slave每秒都会上报自己的offset给master,同时master保存每个slave的offset

10620
来自专栏web前端教室

零基础选择前端技术栈的正确方法

你的技术栈很明显是以兴趣为导向的。也就是说,你这个技术栈就算你真学完了,对于你工资的提高,也没有很大的帮助,因为它本身就是偏的。

10040
来自专栏前端迷

async/await应知应会

async/await 是在 ES7 版本中引入的,它对于 JavaScript 中的异步编程而言是一个巨大的提升。它可以让我们以同步的方式处理异步的流程,同时...

11830
来自专栏编程坑太多

「实战篇」开源项目docker化运维部署-mysql 热备份数据(五)

PS:数据库的热备份,冷还原也讲完了,真心感觉也不是那么复杂。其实就是这样,但是在云平台越来越盛行的今天,基本上买个rdrs数据库这些功能都有了。了解下Xtra...

11130
来自专栏前沿技墅

转型全栈时不待 狼书一开好运来

前端攻城狮要想做到全栈,核心在于以下两点:一是要掌握后端不会的UI(界面);二是要掌握前端不会的DB(业务)。当然,不是倡导大家每一点都接触一下,然后号称自己是...

10520
来自专栏Jerry的SAP技术分享

SAP CRM BOL entity deletion - root node and sub node

版权声明:署名,允许他人基于本文进行创作,且必须基于与原先许可协议相同的许可协议分发本文 (Creative Commons)

12350
来自专栏软测小生

Selenium 4即将发布:每个QA都应该知道的

熟悉Selenium 3.0发布背后故事的人知道,早2013年Selenium团队就放出消息将在圣诞节发布Selenium 3.0,可是,直到2016年Sele...

12830

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励