Node.js实现TCP和HTTP并作简单的比较
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并作简单的比较的更多相关文章
- 一文搞懂如何使用Node.js进行TCP网络通信
摘要: 网络是通信互联的基础,Node.js提供了net.http.dgram等模块,分别用来实现TCP.HTTP.UDP的通信,本文主要对使用Node.js的TCP通信部份进行实践记录. 本文分享自 ...
- Node.js基于Express框架搭建一个简单的注册登录Web功能
这个小应用使用到了node.js bootstrap express 以及数据库的操作 :使用mongoose对象模型来操作 mongodb 如果没了解过的可以先去基本了解一下相关概念~ 首先注 ...
- Node.js使用TCP通讯
原文地址:https://www.cnblogs.com/ay-a/p/9822057.html Node.js 的 net 模块可以方便的创建TCP 服务,,以下是使用 net 模块创建的tcp 服 ...
- node.js(node.js+mongoose小案例)_实现简单的注册登录退出
一.前言 通过node.js基本知识对node.js基本知识的一个简单应用 1.注册 2.登录 3.退出 二.基本内容 1.项目结构搭建如图所示 2.这个小案列中用到了art-template子模板以 ...
- node.js 使用 superagent 与 cheerio 完成简单爬虫
目标 建立一个 lesson3 项目,在其中编写代码. 当在浏览器中访问 http://localhost:3000/ 时,输出 CNode(https://cnodejs.org/ ) 社区首页的所 ...
- node.js+mysql把数据显示到前端简单实例
原以为数据查出来了,要展示是鸡毛蒜皮的事儿!谁知道,我弄了一天....我错就错在没把connection.query里面. 下面的例子是可以的了! 看过我之前文章的同学,应该很熟悉下面的代码,对!主要 ...
- 在nginx服务器里面搭建好node.js本地服务器后,利用Node.js的FS模块,实现简单数据的写入和读取
先在server.js里面引入: var fs = require('fs'); 然后写入 // 往writeme.txt文件 写入一些内容 fs.writeFile('./writem ...
- Node.js学习笔记(4)--简单路由,老师学生id
说明(2017-5-2 17:57:23): 1. foo.js var http = require("http"); var url = require("url&q ...
- Node.js+Navicat for MySQL实现的简单增删查改
前提准备: 电脑上必须装有服务器环境,Navicat for MySQL(我用的是这款MySQL,可随意),Node环境 效果如图所示: 源码地址: GitHub:https://github.com ...
随机推荐
- [转]_int64、long long 的区别
大学生程序代写 C++的64位整数[原]by 赤兔 http://baike.baidu.com/view/1235293.htm 在做ACM题时,经常都会遇到一些比较大的整数.而常用的内置整数类型常 ...
- C#实现根据传入时间段,找出时间段内日期,并生成相对应文件路径
[1]获取固定日期范围内的所有日期,以数组形式返回 /// <summary> /// 获取固定日期范围内的所有日期,以数组形式返回 /// </summ ...
- JAVA JDBC 读取配置文件链接数据库(oracle)
----db.properties-------- dbDriver = oracle.jdbc.driver.OracleDriverurl = jdbc:oracle:thin:@192.168. ...
- Django学习(1)——python manage.py startapp app-name新建app报错问题
作为一个刚接触python的小白,开始学习Django注定前路漫漫,记录一下学习过程中的问题和解决方案. 感谢“自强学堂”的无私奉献,根据教程安装了Django 1.9.12后,尝试新建项目,此时使用 ...
- oracle 12c 多租户 pdb 恢复(单个pdb数据文件、非系统pdb表空间、整个pdb数据库)
环境:数据库版本 Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production 实验准备:1.-- 数据库归 ...
- 上海-北京间通过Azure Storage的RA-GRS类型的存储账户进行快速复制
Azure的Blob存储分成多种类型,目前主要有: 其中RA-GRS可以在上海-北京两个数据中心间同步数据.并且,在第二个数据中心可以只读的方式读取这个存储账户中的Blob内容. 虽然GRS采用的是准 ...
- C#设计模式(12)——享元模式
一.概念 外观模式提供了一个统一的接口,用来访问子系统中的一群接口.外观定义了一个高层接口,让子系统更容易使用.使用外观模式时,我们创建了一个统一的类,用来包装子系统中一个或多个复杂的类,客户端可以直 ...
- k8s组件简介
Kubernetes is constructed using several components, as follows:f Kubernetes masterf Kubernetes nodes ...
- miRNA
MicroRNA (miRNA) 是一类内生的.长度约为20-24个核苷酸的小 RNA,其在细胞内具有多种重要的调节作用.每个 miRNA 可以有多个靶基因的表达,而几个 miRNA 也可以调节同一 ...
- codeforces 367B
题目代码到是不难但是很难想通题目的解决方法. #include<iostream> using namespace std; ]; int main() { int n,m; while( ...