TCP和Node

传输控制协议是一个面向连接的协议,换句话说,它是一个传输层的协议,它主要的职务呢,就是确保信息传输的正确性。

我们使用的很多如HTTP协议都是基于TCP的,为什么呢?因为我们不希望传输的html文件缺斤少两吧,少了一个字符(字节)都可能会造成全体的崩盘吧?

连接数据库的时候我们用的其实也是TCP套接字。

  • 本来吧,IP数据包的传输是无序的?这就是TCP存在的理由,我们总是需要一些规则来限定我们的生活。就像法律一样,没有法律,社会能安定吗?所以,我们需要TCP。同时,为了能够更加自由,TCP是字符编码不敏感的,它不计较传输文件流的字符,它只在乎传输过程安全稳定。法律不在乎所谓人情,它只要理性,它也只负责处理结果。

  • 话不多说,上代码,首先我们先确保我们的telnet服务是打开的(win7默认是关闭的)

    这是我们的服务器,用的是http的模块,实际上net才是tcp的模块

let http=require('http');
http.createServer((req,res)=>{
res.writeHead(200,{'Content-Type':'text/html'});
res.end('<h1>haha</h1>');
}).listen(3000);

之后新建一个cmd窗口,telnet 127.0.0.1 3000 如果没有报错就是连接成功了~

  • 接下来,我们进行代码2的编写
let net=require('net');
let server=net.createServer(function(conn){
console.log("新的连接");
});
server.listen(3000,function(){
console.log('\033[96m server listening on *:3000\033[39m');
})

之后我们再次开一个新窗口telnet localhost 300 , 我们发现,屏幕输出了新的连接这样一排字。

这一次我们使用的是net模块,因此我们也可以很好的理解,http是封装在tcp之上的协议。

**其实express就是又在http上封装了一层(参见req,res),而koa则相当于在http上封装了两层(参见ctx.req,ctx.res) **

修改上述代码,用cmd写telnet再试试?事情变得非常有趣了哈哈哈!

	console.log("新的连接");
console.log("当前有"+count+"个连接!");
count++;
conn.on('close',function(){
count--;
console.log("1个连接已断开,现在有"+count+"个连接")
});
conn.on('data',function(data){
conn.setEncoding('utf-8'); //如果不设置它下方的注释就成真了
console.log(data);// buffer类型
});

TCP和HTTP服务器有着两个本质的区别,其一,那就是回调类型中对象的类型。net服务器中它是一个连接对象,而HTTP服务器中,则是请求和相应对象。

其二,就是,浏览器在访问站点的时候不会只用一个连接,很多主流浏览器为了速度一次会同时打开七八个连接,并发送请求。

HTTP是比TCP更高层的API。

默认情况下,Node会告诉浏览器保持连接,因为多次断开TCP在打开TCP这样更影响效率。

下面我用HTTP来实现一个简单的请求的过程(或者说客户端和服务器会话?)

server.js

let http=require('http');
http.createServer((req,res)=>{
res.writeHead(200);
res.end('Hello,world');
}).listen(3000);

client.js

let http=require('http');
let _http_req={
host:'127.0.0.1',
port:3000,
url:'/',
method:'GET'
};
http.request(_http_req,(res)=>{
let content='';
res.setEncoding('utf-8');
res.on('data',(chunk)=>{
content+=chunk;
});
res.on('end',()=>{
console.log(content);
});
}).end();

使用 http.request() 必须总是调用 req.end()来表明请求的结束,即使没有数据被写入请求主体。

Node.js实现TCP和HTTP并作简单的比较的更多相关文章

  1. 一文搞懂如何使用Node.js进行TCP网络通信

    摘要: 网络是通信互联的基础,Node.js提供了net.http.dgram等模块,分别用来实现TCP.HTTP.UDP的通信,本文主要对使用Node.js的TCP通信部份进行实践记录. 本文分享自 ...

  2. Node.js基于Express框架搭建一个简单的注册登录Web功能

    这个小应用使用到了node.js  bootstrap  express  以及数据库的操作 :使用mongoose对象模型来操作 mongodb 如果没了解过的可以先去基本了解一下相关概念~ 首先注 ...

  3. Node.js使用TCP通讯

    原文地址:https://www.cnblogs.com/ay-a/p/9822057.html Node.js 的 net 模块可以方便的创建TCP 服务,,以下是使用 net 模块创建的tcp 服 ...

  4. node.js(node.js+mongoose小案例)_实现简单的注册登录退出

    一.前言 通过node.js基本知识对node.js基本知识的一个简单应用 1.注册 2.登录 3.退出 二.基本内容 1.项目结构搭建如图所示 2.这个小案列中用到了art-template子模板以 ...

  5. node.js 使用 superagent 与 cheerio 完成简单爬虫

    目标 建立一个 lesson3 项目,在其中编写代码. 当在浏览器中访问 http://localhost:3000/ 时,输出 CNode(https://cnodejs.org/ ) 社区首页的所 ...

  6. node.js+mysql把数据显示到前端简单实例

    原以为数据查出来了,要展示是鸡毛蒜皮的事儿!谁知道,我弄了一天....我错就错在没把connection.query里面. 下面的例子是可以的了! 看过我之前文章的同学,应该很熟悉下面的代码,对!主要 ...

  7. 在nginx服务器里面搭建好node.js本地服务器后,利用Node.js的FS模块,实现简单数据的写入和读取

    先在server.js里面引入: var fs = require('fs');   然后写入  // 往writeme.txt文件 写入一些内容     fs.writeFile('./writem ...

  8. Node.js学习笔记(4)--简单路由,老师学生id

    说明(2017-5-2 17:57:23): 1. foo.js var http = require("http"); var url = require("url&q ...

  9. Node.js+Navicat for MySQL实现的简单增删查改

    前提准备: 电脑上必须装有服务器环境,Navicat for MySQL(我用的是这款MySQL,可随意),Node环境 效果如图所示: 源码地址: GitHub:https://github.com ...

随机推荐

  1. 什么是DMIPS

    MIPS: Million Instructions executed Per Second,每秒百万条指令,用来计算同一秒内系统的处理能力 DMIPS: Dhrystone Million Inst ...

  2. Oracle中spool命令实现的两种方法比较

    ---恢复内容开始--- 要输出符合要求格式的数据文件只需在select时用字符连接来规范格式.比如有如下表 SQL>; select id,username,password from myu ...

  3. 第K大子集-LH

    题解:搜索+二分 对于每个数有选与不选两种情况.然后我们先搜前一半的状态,每个数选还是不选. 有2^17种,然后我将每种状态拍一个序先存着.然后我再搜后一半的状态,2^18种. 假设后一半某一种情况的 ...

  4. HDOJ1166(线段树点修改)

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  5. Project Server2016升级安装问题项目中心无法显示

    sharepoint 2016升级后,project server 相关中心页面出现空白页面,这是是sharepoint2016一个bug,解决方案用PWA.resx内容替换PWA.en-us.res ...

  6. BO 与 VO 的属性拷贝 copyProperties(bo,vo)

    NewClass extends OldClass   : newClass继承自oldClass,属性大多数相同,但是也有新的扩展. beanUtils.copyProperties(oldClas ...

  7. java数据库连接模板代码通用收集

    package org.lxh.dbc; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLE ...

  8. js页面跳转常用的几种方式(转)

    js页面跳转常用的几种方式 转载  2010-11-25   作者:    我要评论 js实现页面跳转的几种方式,需要的朋友可以参考下. 第一种: 复制代码代码如下: <script langu ...

  9. HTML5新增的结构元素

    HTML5的结构 一:新增的主体结构元素 在HTML5中,为了使文档的结构更加清晰明确,追加了几个与页眉,页脚内容区块等文档结构相关联的结构元素. 1.1article元素 article元素代表文档 ...

  10. 分布式系统中Unique ID 的生成方法

    http://darktea.github.io/notes/2013/12/08/Unique-ID 本文主要介绍在一个分布式系统中, 怎么样生成全局唯一的 ID 一, 问题描述 在分布式系统存在多 ...