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(
'\r\n > welcome to \033[92mnode-chat\033[39m!'
+ '\r\n > ' + count + ' other people are connected at this time.'
+ '\r\n > 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('\r\n','');
if(!nickname){
if(users[data]){
conn.write('\r\n \033[93m> nickname already in use.try again:\033[39m ');
return;
}else{
nickname=data;
users[nickname]=conn; broadcast('\r\n \033[90m > ' + nickname + ' joined the room\033[39m');
}
}
else{
broadcast('\r\n \033[96m > ' + nickname + ':\033[39m ' + data,true);
}
});
conn.setEncoding('utf8');
conn.on('close',function () {
count--;
delete users[nickname];
broadcast('\r\n \033[90m > ' + nickname + ' left the room\033[39m');
});
}); server.listen(3000,function () {
console.log('\r\n \033[96m server listening on *:3000\033[39m');
}); 
  • createServer回调函数接受一个对象,他是可读写的流对象,传递net.Stream;
  • Node.js中有两个和连接终止相关的事件:  //触发的时候会发送一个名为‘FIN'的包给服务器,意味结束连接;
    • end:客户端关闭TCP连接时触发;
    • close:客户端关闭连接或发生error事件时触发;

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

nodeAPI--TCP的更多相关文章

  1. Tcp/ip 报文解析

    在编写网络程序时,常使用TCP协议.那么一个tcp包到底由哪些东西构成的呢?其实一个TCP包,首先需要通过IP协议承载,而IP报文,又需要通过以太网传送.下面我们来看看几种协议头的构成 一 .Ethe ...

  2. C#高性能TCP服务的多种实现方式

    哎~~ 想想大部分园友应该对 "高性能" 字样更感兴趣,为了吸引眼球所以标题中一定要突出,其实我更喜欢的标题是<猴赛雷,C#编写TCP服务的花样姿势!>. 本篇文章的主 ...

  3. Android实现TCP断点上传,后台C#服务实现接收

    终端实现大文件上传一直都是比较难的技术,其中涉及到后端与前端的交互,稳定性和流量大小,而且实现原理每个人都有自己的想法,后端主流用的比较多的是Http来实现,因为大多实现过断点下载.但稳定性不能保证, ...

  4. 漫谈TCP

    不得不承认,tcp是一个非常复杂的协议.它包含了RFC793及之后的一些协议.能把tcp的所有方面面面具到地说清楚,本身就是个很复杂的事情.如果再讲得枯燥,那么就会更让人昏昏欲睡了.本文希望能尽量用稍 ...

  5. 高性能 TCP/UDP/HTTP 通信框架 HP-Socket v4.1.1

    HP-Socket 是一套通用的高性能 TCP/UDP/HTTP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP/HTTP 通信系统,提供 C/ ...

  6. TCP/IP基础

    TCP/IP 是用于因特网 (Internet) 的通信协议. 计算机通信协议是对那些计算机必须遵守以便彼此通信的规则的描述. 什么是 TCP/IP? TCP/IP 是供已连接因特网的计算机进行通信的 ...

  7. TCP/IP之TCP_NODELAY与TCP_CORK

    TCP/IP之Nagle算法与40ms延迟提到了Nagle 算法.这样虽然提高了网络吞吐量,但是实时性却降低了,在一些交互性很强的应用程序来说是不允许的,使用TCP_NODELAY选项可以禁止Nagl ...

  8. TCP/IP之Nagle算法与40ms延迟

    Nagle算法是针对网络上存在的微小分组可能会在广域网上造成拥塞而设计的.该算法要求一个TCP连接上最多只能有一个未被确认的未完成的小分组,在该分组确认到达之前不能发送其他的小分组.同时,TCP收集这 ...

  9. TCP的数据传输小结

    TCP的交互数据流 交互式输入 通常每一个交互按键都会产生一个数据分组,也就是说,每次从客户传到服务器的是一个字节的按键(而不是每次一行) 经受时延的确认 通常TCP在接受到数据时并不立即发送ACK: ...

  10. TCP服务和首部知识点小结

    服务 应用程序会被TCP分割成数据段,而UDP不分割. TCP有超时重传和确认 如果检验和出错将丢弃 IP数据包可能会失序或者重复,所以TCP会处理 滑动窗口来进行流量控制 对字节流的内容不做任何解释 ...

随机推荐

  1. sql把表格拼成字符串,多半使用于GROUP BY

    --假定要聚合的字段是id ,要统计的字段是tname --select a.tname from @T1 a for xml path('row') select id,REPLACE(replac ...

  2. 改变edittext边框颜色

    转载自:点击打开链接 第一步:为了更好的比较,准备两个一模一样的EditText(当Activity启动时,焦点会在第一个EditText上,如果你不希望这样只需要写一个高度和宽带为0的EditTex ...

  3. Maya导入Unity的教程

    原地址:http://www.cocoachina.com/gamedev/gameengine/2010/0601/1586.html 昨天已经发布了1Vr.Cn翻译的多维材质模型烘培入Unity  ...

  4. ruby代码重构第一课

    (文章是从我的个人主页上粘贴过来的, 大家也可以访问我的主页 www.iwangzheng.com) 新手写代码的时候往往会出现很多重复的代码没有提取出来,大师高瞻远瞩总能提点很多有意义的改进,今天重 ...

  5. [BZOJ3872][Poi2014]Ant colony

    [BZOJ3872][Poi2014]Ant colony 试题描述 There is an entrance to the ant hill in every chamber with only o ...

  6. 自编译ngrok服务器

    转载:http://www.haiyun.me/archives/1012.html 首先安装GO环境,http://www.haiyun.me/archives/1009.html 1 2 3 4 ...

  7. Gson @Expose熟悉和@SerializedName属性

    这两个属性一般配套使用. 1.@Expose标签的2个属性.     deserialize (boolean) 反序列化 默认 true        serialize  (boolean) 序列 ...

  8. thinkphp 前台html调用函数 格式化输出

    仅仅是输出变量并不能满足模板输出的需要,内置模板引擎支持对模板变量使用调节器和格式化功能,其实也就是提供函数支持,并支持多个函数同时使用.用于模板标签的函数可以是PHP内置函数或者是用户自定义函数,和 ...

  9. STM32canopen调试

    问题1:用usbcan监测不到can口的报文 属于接线问题 CANopen程序总使用的是can1 对应的接下口在J1的1和2口,而其接口排序是从外向里排序,故最外面的为1号接口,由于接线时,按照左边的 ...

  10. CAS单点登录之mysql数据库用户验证及常见问题

    前面已经介绍了CAS服务器的搭建,详情见:搭建CAS单点登录服务器.然而前面只是简单地介绍了服务器的搭建,其验证方式是原始的配置文件的方式,这显然不能满足日常的需求.下面介绍下通过mysql数据库认证 ...