“ 不能因一点成功或失败,就对自己肯定或否定,始终要对自己有清醒的认识”
万古人间四月天,各位宝宝要在工作之余多去户外活动哦~
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