nodeAPI--TCP

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-chat33[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 room33[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 room33[39m');
});
});

server.listen(3000,function () {
console.log('
 33[96m   server listening on *:300033[39m');
}); 
  • createServer回调函数接受一个对象,他是可读写的流对象,传递net.Stream;
  • Node.js中有两个和连接终止相关的事件:  //触发的时候会发送一个名为‘FIN'的包给服务器,意味结束连接;
    • end:客户端关闭TCP连接时触发;
    • close:客户端关闭连接或发生error事件时触发;

//window退出telnet: ctrl + ], quit; mac: alt + [, quit;           window回车:' ',    mac回车:' ';

原文地址:https://www.cnblogs.com/jinkspeng/p/4100314.html