Node HTTP服务器是构建与Node TCP服务器之上的,即http.Server继承自net.Server;
TCP特性:
- 面向连接的通信和保证顺序的传递:
- IP的协议是面向无连接,且数据包送达时是无序的,这些数据包不属于任何数据流或连接;
- 使用TCP/IP和服务器建立连接后,在TCP连接内进行数据传输时,发送的IP数据报包含了标识该连接及数据流顺序的信息;
- 面向字节:
- TCP对字符及字符编码是完全无知的,不同的编码会导致传输的字符数不同;
- 所以TCP允许数据以ASCII字符(每个字符一个字节)或Unicode(每个字符四个字节)进行传输;
- 可靠性:由于TCP是基于底层不可靠的服务,所以它必须要基于确认和超时实现一系列机制来达到可靠性要求;
- 流控制:TCP会通过流控制的方式来确保两点之间数据传输的平衡;//如两台通信计算机传输速度不同;
- 拥堵控制:TCP有一种内置的机制能控制数据包的延迟率以及丢包率不会太高;
Telnet:
- 早期的网络协议,旨在提供双向的虚拟终端,后被SHH替代;
- Telent是明码传输,SSH是加密传输;
- Telnet是TCP协议上层的协议;
基于TCP的聊天程序: //在window下会出现问题;
var net=require('net'); var count=0,users={}; var server=net.createServer(function (conn) { conn.write( ' > welcome to 33[92mnode-chat 33[39m!' + ' > ' + count + ' other people are connected at this time.' + ' > please write your name and press enter: ' ); count++; var nickname; function broadcast (msg,exceptMyself) { for (var i in users) { if (!exceptMyself || i != nickname) { users[i].write(msg); } } } conn.on('data',function (data) { //data=data.replace(' ',''); if(!nickname){ if(users[data]){ conn.write(' 33[93m> nickname already in use.try again: 33[39m '); return; }else{ nickname=data; users[nickname]=conn; broadcast(' 33[90m > ' + nickname + ' joined the room 33[39m'); } } else{ broadcast(' 33[96m > ' + nickname + ': 33[39m ' + data,true); } }); conn.setEncoding('utf8'); conn.on('close',function () { count--; delete users[nickname]; broadcast(' 33[90m > ' + nickname + ' left the room 33[39m'); }); }); server.listen(3000,function () { console.log(' 33[96m server listening on *:3000 33[39m'); });
- createServer回调函数接受一个对象,他是可读写的流对象,传递net.Stream;
- Node.js中有两个和连接终止相关的事件: //触发的时候会发送一个名为‘FIN'的包给服务器,意味结束连接;
- end:客户端关闭TCP连接时触发;
- close:客户端关闭连接或发生error事件时触发;
//window退出telnet: ctrl + ], quit; mac: alt + [, quit; window回车:' ', mac回车:' ';