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 ...
随机推荐
- IntelliJ手记
1. 配置JDK:File - Project Structure - SDKs,点击“+”即可: 2. 配置远程调试,对于azkaban的远程调试,在azkaban-solo-start.sh里面的 ...
- 洛谷【P1601】A+B Problem(高精)
题目传送门:https://www.luogu.org/problemnew/show/P1601 高精度加法板子.我们灵性地回忆一波小学学加法列竖式的场景(从\(6\)岁开始口算从未打过草稿的大佬请 ...
- bzoj 2648 SJY摆棋子——KDtree
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2648 第一道KDtree! 学习资料:https://blog.csdn.net/zhl30 ...
- SQL Server:sp_send_dbmail参数设置
sp_send_dbmail [ [ @profile_name = ] 'profile_name' ] [ , [ @recipients = ] 'recipients [ ; n ]' ...
- Poj 1936,3302 Subsequence(LCS)
一.Description(3302) Given a string s of length n, a subsequence of it, is defined as another string ...
- Java应用中使用ShutdownHook友好地清理现场、退出JVM的2种方法
Runtime.getRuntime().addShutdownHook(shutdownHook); 这个方法的含义说明: 这个方法的意思就是在jvm中增加一个关闭的钩子,当jv ...
- Debain install Jupyter
1. install Anaconda https://www.anaconda.com/download/#linux 2. config jupyter $ ipython from notebo ...
- k8s 基础(4) k8s安装
转自 http://www.cnblogs.com/informatics/p/7389806.html 安装和配置 从github.com/kubernetes/kubernetes上下载1.6.8 ...
- Java探索之旅(8)——继承与多态
1父类和子类: ❶父类又称基类和超类(super class)子类又称次类和扩展类.同一个package的子类可以直接(不通过对象)访问父类中的(public,缺省,protected)数据和方法. ...
- [HDU1711]KMP模板
解题关键:1.直接套kmp模板即可,注意最后输出的位置,需要在索引的位置+1. 2.next用作数组名在oj中会编译错误, 3.选用g++,只有g++才会接受bits/stdc++.h OJ中g++和 ...