zoukankan      html  css  js  c++  java
  • 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()来表明请求的结束,即使没有数据被写入请求主体。

  • 相关阅读:
    手把手教你创建ASP.NET MVC Dashboard应用
    DevExpress ASP.NET v20.2版本亮点放送:甘特图控件全面升级
    .NET 6已到来?Telerik WinForm率先支持
    手把手教你创建一个Vue Dashboard应用
    Kendo UI for jQuery数据管理使用教程:更改PivotGrid字段名称
    现代应用的启动屏幕如何更美观?这款第三方控件你使用了吗?
    VS插件CodeRush v20.2.8正式发布,支持新的代码模板
    这个三方控件,让你的ASP.NET应用图表界面更酷炫
    nginx负载均衡技术基础
    面向过程的代码请不要拆分成多个脚本
  • 原文地址:https://www.cnblogs.com/can-i-do/p/7144480.html
Copyright © 2011-2022 走看看