当前位置: 首页 > 后端技术 > Node.js

节点学习记录:网络编程

时间:2023-04-04 00:24:23 Node.js

笔记|LinuxNetworkBa??sicNetworkLayering在实际的操作系统中,只有应用层、传输层、网络层和链路层。Node提供了net、dgram、http、https四个模块,分别处理TCP、UDP、HTTP、HTTPS。它适用于服务器和客户端。TCPhttpcodecode描述200请求处理成功301/302永久重定向/临时重定向403无权限访问404表示没有对应的资源401(Unauthorized)请求需要认证。对于登录后请求的网页,服务器可能会返回此响应(如知乎,需要登录才能查看)500服务器错误503服务器宕机或OSI模型(物理层,数据链路)正在维护传输控制协议层、网络层)、传输层、会话层、表示层、应用层)属于传输层协议TCP是面向连接的协议,在传输前需要三次握手形成会话。戳这里看详细解释CreateaTCPservervarnet=require('net');varserver=net.createServer(function(socket){//新建连接socket.on('data',function(data){socket.write("Hello")});socket.on('end',function(){console.log('connectiondisconnected')});socket.write("Example:\n");});服务器.listen(8124,function(){console.log('serverbound');});通过net模块构造客户端进行会话。测试上面搭建的TCP服务的代码如下:varnet=require('net');varclient=net.connect({port:8124},function(){//'connect'listenerconsole.log('客户端连接');client.write('world!\r\n');});client.on('data',function(data){console.log(data.String());client.end();});client.on('结束',function(){console.log('客户端断开连接');});以上客户端代码保存为client.js,执行$nodeclient.jsclientconnected示例:HelloclientdisconnectedUDP用户数据包协议,与TCP一样属于网络传输层。UDP不是面向连接的。DNS服务就是基于它实现的。创建UDP服务器vardgram=require('dgram');varserver=dgram.createSocket("udp4");server.on("message",function(msg,rinfo){console.log("servergot:"+msg+"from"+rinfo.address+":"+rinfo.port);});server.on("监听",function(){varaddress=server.address();console.log("服务器监听"+address.address+":"+address.port);});server.bind(41234);创建UDP客户端vardgram=require('dgram');varmessage=newBuffer("Node.js")varclient=dgram.createSocket("udp4");client.send(message,0,message.length,41234,"localhost",function(err,bytes){client.close();});保存为client.js并执行,服务器端命令行会输出如下$nodeclient.jsserverlistening0.0.0.0:41234servergot:Node.jsfrom127.0.0.1:58682与TCPsocket的Write()比较,发送()该方法的参数列表比较复杂,但比较灵活,可以随意向网络中的服务器发送数据,如果TCP要向另一台服务器发送数据,需要构造新的连接再次通过插座。HTTPTCP和UDP都属于网络传输层协议。如果你想构建一个高效的网络应用,你应该从传输层开始。Node提供了基本的http和https模块,用于对HTTP和HTTPS的封装。对于其他应用层协议(SMTP、IMAP等),你也可以从社区中找到实现。实现HTTP服务器:varhttp=require('http');http.createServer(function(req,res){res.wirteHead(200,{'Content-Type':'text/plain'});res.end('HelloWorld\n');}).listen(1337,'127.0.0.1');console.log("Serverrunningathttp://127.0.0.1:1337/")虽然这个小服务器只能回复你好World,但是可以保持相当的并发量和QPS。HTTP消息HTTP的全称是HypertextTransferProtocol。它建立在TCP之上,属于应用层协议。HTTP的两端分别是server和browser(B/S模式)http模块。对于http模块的一些例子,你可以点击这里ServingHTMLPagevarhttp=require('http');varfs=require('fs');varserver=http.createServer(function(req,res){console.log('requestwasmade:'+req.url);res.writeHead(200,{'Content-Type':'text/html'});varmyReadStream=fs.createReadStream(__dirname+'/index.html','utf8');myReadStream.pipe(res);});server.listen(3000,'127.0.0.1');console.log('nowlisteningtoport3000');ServingJSONdataarhttp=require('http');varfs=require('fs');varserver=http.createServer(function(req,res){console.log('requestwasmade:'+req.url);res.writeHead(200,{'Content-Type':'application/json'});varmyObj={name:'AlexZ33',job:"Engineer",age:'26'}res.end(JSON.stringify(myObj));//end()中括号是string或者buffer,所以不能直接使用对象myObj进行转换});server.listen(3000,'127.0.0.1');console.log('nowlisteningtoport3000');HTTPS和HTTP2HTTP/2net.Socketnet.Socket是一个双工的流(双工流)//net.d.tsclassSocketextendsstream.Duplex{constructor(options?:SocketConstructorOpts);//扩展基方法write(buffer:Buffer|Uint8Array|string,cb?:(err?:Error)=>void):boolean;write(str:Buffer|Uint8Array|string,encoding?:string,cb?:(err?:Error)=>void):布尔值;连接(选项:SocketConnectOpts,connectionListener?:()=>无效):这个;连接(端口:数字,主机:字符串,connectionListener?:()=>无效):这个;连接(端口:号码,connectionListener?:()=>无效):这个;connect(path:string,connectionListener?:()=>void):这个;设置编码(编码?:字符串):这个;暂停():这个;恢复():这个;setTimeout(timeout:number,callback?:()=>void):这个;setNoDelay(noDelay?:boolean):这个;setKeepAlive(启用?:布尔值,initialDelay?:number):这个;地址():地址信息|细绳;未引用():无效;参考():无效;只读缓冲区大小:数字;只读字节读取:数字;只读字节写:数字;只读连接:布尔值;只读销毁:布尔值;只读本地地址:字符串;只读本地端口:数字;只读远程地址?:字符串;只读远程家庭?:字符串;只读远程端口?:数字;//扩展基方法end(cb?:()=>void):void;结束(缓冲区:缓冲区|Uint8Array|字符串,cb?:()=>无效):无效;结束(str:缓冲区|Uint8Array|字符串,编码?:字符串,cb?:()=>void):void;/***events.EventEmitter*1.close*2.connect*3.data*4.d??rain*5.end*6.error*7.lookup*8.timeout*/addListener(event:string,监听器:(...args:any[])=>void):this;addListener(事件:“关闭”,侦听器:(had_error:布尔值)=>void):这个;添加监听器(事件:“连接”,监听器:()=>无效):这个;addListener(事件:“数据”,侦听器:(数据:缓冲区)=>void):这个;addListener(事件:“drain”,监听器:()=>void):这个;添加监听器(事件:“结束”,监听器:()=>无效):这个;addListener(事件:“错误”,侦听器:(错误:错误)=>无效):这个;addListener(event:"lookup",listener:(err:Error,address:string,family:string|number,host:string)=>void):this;添加监听器(事件:“超时”,监听器:()=>无效):这个;发出(事件:字符串|符号,...args:任何[]):布尔值;发出(事件:“关闭”,had_error:布尔值):布尔值;发出(事件:“连接”):布尔值;发出(事件:“数据”,数据:缓冲区):布尔值;发射(事件:“排水”):布尔值;发出(event:“结束”):布尔值;发出(事件:“错误”,错误:错误):布尔值;发出(事件:“查找”,错误:错误,地址:字符串,家庭:字符串|数字,主机:字符串):布尔值;发出(事件:“超时”):布尔值;on(event:string,listener:(...args:any[])=>void):这个;on(event:"close",listener:(had_error:boolean)=>void):这个;on(event:"connect",listener:()=>void):这个;on(event:"data",listener:(data:Buffer)=>void):这个;on(event:"drain",listener:()=>void):这个;on(event:"end",listener:()=>void):这个;on(event:"error",listener:(err:Error)=>void):这个;on(event:"lookup",listener:(err:Error,address:string,family:string|number,host:string)=>void):this;on(event:"timeout",listener:()=>void):这个;once(event:string,listener:(...args:any[])=>void):this;一次(事件:“关闭",listener:(had_error:boolean)=>void):this;once(event:"connect",listener:()=>void):this;once(event:"data",监听器:(data:Buffer)=>void):this;once(event:"drain",listener:()=>void):this;once(event:"end",listener:()=>void):this;once(event:"error",listener:(err:Error)=>void):this;once(event:"lookup",listener:(err:Error,address:string,family:string|number,host:string)=>无效):这个;一次(事件:“超时”,监听器:()=>无效):这个;prependListener(事件:字符串,监听器:(...args:任何[])=>无效):这个;prependListener(事件:“关闭”,侦听器:(had_error:布尔值)=>无效):这个;prependListener(事件:“连接”,侦听器:()=>无效):这个;prependListener(事件:“数据”,侦听器:(数据:缓冲区)=>void):this;prependListener(event:"drain",listener:()=>void):this;prependListener(event:"end",listener:()=>void):this;prependListener(event:"error",listener:(err:Error)=>void):this;prependListener(event:"lookup",listener:(err:Error,address:string,family:string|number,host:string)=>void):this;prependListener(事件:“超时”,监听器:()=>void):这个;prependOnceListener(event:string,listener:(...args:any[])=>void):this;prependOnceListener(event:"close",listener:(had_error:boolean)=>void):this;prependOnceListener(事件:“连接”,侦听器:()=>无效):这个;prependOnceListener(event:"data",listener:(data:Buffer)=>void):this;prependOnceListener(事件:“drain”,监听器:()=>void):这个;prependOnceListener(事件:“结束”,侦听器:()=>无效):这个;prependOnceListener(event:"error",listener:(err:Error)=>void):this;prependOnceListener(event:"lookup",listener:(err:Error,address:string,family:string|number,host:string)=>void):this;prependOnceListener(事件:“超时”,侦听器:()=>无效):这个;}net.Server参考Node.js知识点详解(二)一个HTTP事务的HTTP模块和事件模块剖析《nodejs 深入浅出》《图解HTTP》