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('33[96m  server listening on *:300033[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()来表明请求的结束,即使没有数据被写入请求主体。

原文地址:https://www.cnblogs.com/can-i-do/p/7144480.html