版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Node.js网络编程与API开发CONTENTS目录01TCP/UDP编程02HTTP编程03RESTfulAPI设计规范04实时通信net模块应用Node.js的net模块是TCP网络编程的核心工具,用于构建可靠、面向连接的通信服务。通过net.createServer()可快速创建TCP服务器,通过net.connect()实现客户端连接,支持事件(如data事件、end事件)驱动数据传输。典型应用包括即时通信(如聊天服务器)、远程终端/SSH工具、数据库/微服务间通信、文件传输(结合流式读写)等,其优势是低延迟、数据完整性有保障,适合需要稳定连接的场景。1.TCP/UDP编程TCP与UDP是传输层核心协议。TCP(可靠传输)通过三次握手建立连接,保证数据的顺序与完整性(如HTTP),但延迟较高;UDP(高效传输)无连接、不保证可达性,适用于实时场景(如视频会议)。TCP需维护socket会话流式传输,UDP基于数据包(dgram模块)单次发送。TCP可靠、有序,适用于文件传输/数据库;UDP快速、轻量,适用于DNS/物联网。1.TCP/UDP编程1.TCP服务器实现TCP是面向连接的、可靠的、基于字节流的传输层协议。使用net模块创建TCP服务器时,服务器会监听指定端口,等待客户端连接。(1)关键方法。①
创建TCP服务器实例。语法格式:net.createServer([options][,connectionListener])参数说明:options(可选项):配置对象,如{allowHalfOpen:true}。connectionListener:连接监听器,接收socket对象。net模块应用1.TCP/UDP编程②
启动服务器监听功能。语法格式:server.listen(port[,host][,backlog][,callback])参数说明:port:监听端口。host(可选项):监听地址,默认为。backlog(可选项):最大排队连接数。callback(可选项):监听成功回调。(2)核心事件。①connection:新客户端连接时触发,回调接收socket对象。②data:客户端发送数据时触发,回调接收数据。③end:客户端断开连接时触发。④error:发生错误时触发。⑤close:服务器关闭时触发。net模块应用1.TCP/UDP编程【验证示例5-1】1.TCP/UDP编程2.TCP客户端实现(1)关键方法:创建TCP客户端连接。语法格式:net.createConnection(options[,connectListener])参数说明:options:配置对象,如{port:3000,host:'localhost'}。connectListener:连接成功回调。(2)核心事件。connect:连接成功时触发。data:收到服务器数据时触发。end:连接关闭时触发。error:发生错误时触发。net模块应用1.TCP/UDP编程【训练实例5-1】建立TCP服务器和客户端之间的连接并进行通信【操作要求】在文件夹Unit05中创建子文件夹case0501,在文件夹case0501中使用VSCode创建JavaScript文件server0501.js和client0501.js,在这两个文件中编写代码建立TCP服务器和客户端之间的连接并进行通信。【实现过程】(1)创建JavaScript文件与编写程序代码。在文件夹Unit05中创建子文件夹case0501,在文件夹case0501中创建JavaScript文件server0501.js,在该文件中输入以下代码:1.TCP/UDP编程【训练实例5-1】建立TCP服务器和客户端之间的连接并进行通信(2)运行程序与输出结果。打开一个命令行窗口,该窗口中模拟服务器端,将文件夹case0501设置为当前文件夹,在服务器端的命令行执行“nodeserver0501.js”命令启动服务器。此时,服务器端的命令行输出以下信息:服务器已启动,监听端口3000打开第2个命令行窗口,该窗口中模拟客户端,将文件夹case0501设置为当前文件夹,在客户端的命令行执行“nodeclient0501.js”命令启动客户端。此时,客户端的命令行输出以下信息:1.TCP/UDP编程dgram模块应用
1.UDP服务器实现UDP是无连接的、不可靠的传输层协议,适用于实时性要求高的场景。使用dgram模块创建UDP服务器时,服务器会绑定到指定端口接收数据报。(1)关键方法。①
创建UDP套接字。使用dgram.createSocket()创建UDP套接字。语法格式:dgram.createSocket(options[,callback])参数说明:options:配置对象,如{type:'udp4',reuseAddr:true}。callback:接收消息回调,等价于监听message事件。1.TCP/UDP编程dgram模块应用
②
绑定端口和地址。如果需要客户端接收数据(双向通信),需绑定本地端口。语法格式:socket.bind([port][,address][,callback])参数说明:port(可选项):监听端口。address(可选项):监听地址。callback(可选项):绑定成功回调。1.TCP/UDP编程dgram模块应用
③
发送数据报。向指定地址和端口发送数据。语法格式:socket.send(msg,offset,length,port,address[,callback])参数说明:msg:要发送的数据(Buffer对象或字符串)。offset:数据偏移量。length:数据长度。port:目标服务器端口。address:目标服务器地址。callback(可选项):发送完成后的回调函数。1.TCP/UDP编程dgram模块应用
④
关闭客户端。释放资源并关闭套接字。语法格式:client.close();(2)核心事件。①message:收到数据报时触发,回调接收(msg,rinfo)。示例代码:client.on('message',(msg,rinfo)=>{console.log('收到来自${rinfo.address}:${rinfo.port}的消息:${msg}');});参数说明:msg:接收到的数据(Buffer类型)。rinfo:远程地址信息对象,包含address、port等。1.TCP/UDP编程dgram模块应用
②listening:绑定端口成功后触发,仅在调用bind()时有效。示例代码:client.on('listening',()=>{constaddress=client.address();console.log('客户端监听${address.address}:${address.port}');});③error:发生错误时触发。示例代码:client.on('error',(err)=>{console.error('客户端错误:${err.stack}');client.close();});④close:套接字关闭时触发。1.TCP/UDP编程dgram模块应用
【验证示例5-3】在文件夹Unit05中创建文件demo0503.js,在该文件中输入代码。从本书配套的教学资源中打开“验证示例5-3”对应的程序文件demo0503.js,浏览相应代码。文件demo0503.js的执行结果如下:服务器监听:4000UDPServer启动消息已发送到:4000收到来自:51256的消息:Hello,UDPServer!1.TCP/UDP编程dgram模块应用
2.UDP客户端实现实现UDP客户端使用的方法、事件与实现UDP服务器的方法、事件类似。【验证示例5-4】在文件夹Unit05中创建文件demo0504.js,在该文件中输入代码。从本书配套的教学资源中打开“验证示例5-4”对应的程序文件demo0504.js,浏览相应代码。文件demo0504.js的执行结果如下:服务器监听:4000UDPServer启动数据已发送到服务器收到来自:61413的消息:你好,这是UDP客户端发送的消息收到来自:4000的响应:UDP服务器已收到消息客户端已关闭1.TCP/UDP编程【训练实例5-2】建立UDP服务器和客户端之间的连接并进行通信【操作要求】在文件夹Unit05中创建子文件夹case0502,在文件夹case0502中使用VSCode创建JavaScript文件server0502.js和client0502.js,在这两个文件中编写代码建立UDP服务器和客户端之间的连接并进行通信。【实现过程】(1)在文件夹Unit05中创建子文件夹case0502。(2)在文件夹case0502中创建JavaScript文件server0502.js,在该文件中输入代码。从本书配套的教学资源中打开“训练实例5-2”对应的程序文件server0502.js,浏览相应代码。(3)在文件夹case0502中创建JavaScript文件client0502.js,在该文件中输入代码。从本书配套的教学资源中打开“训练实例5-2”对应的程序文件client0502.js,浏览相应代码。1.TCP/UDP编程【训练实例5-2】建立UDP服务器和客户端之间的连接并进行通信(4)运行程序与输出结果。打开一个命令行窗口,该窗口中模拟服务器端,将文件夹case0502设置为当前文件夹,在服务器端的命令行执行“nodeserver0502.js”命令启动服务器。此时服务器端命令行输出以下信息:服务器监听:4000UDP服务器已启动,监听端口4000打开第2个命令行窗口,该窗口中模拟客户端,将文件夹case0502设置为当前文件夹,在客户端的命令行执行“nodeclient0502.js”命令启动客户端。此时,客户端的命令行输出以下信息:消息已发送到:4000收到来自服务器:4000的响应:消息已收到,UDP服务器正常工作!服务器端的命令行输出以下信息:收到来自:50867的消息:Hello,UDPServer!10秒之后,客户端自行关闭,且输出以下信息:客户端已关闭1.TCP/UDP编程UDP文件上传1.基本原理UDP数据报有大小限制(通常为65507字节),发送端大文件需要分片传输,接收端按顺序重组数据。实现可靠传输需添加序列号、有确认机制和超时重传机制。2.数据分片数据分片策略如下。(1)将文件按固定大小分片,如每片1024字节。(2)为每个分片数据添加元信息,如序号、总片数、数据长度等。(3)使用JSON或自定义协议封装元信息。数据分片的示例代码:constfs=require('fs');constfileBuffer=fs.readFileSync('test.jpg');constCHUNK_SIZE=1024;//每个分片数据大小为1024字节,即1KBfor(leti=0;i<fileBuffer.length;i+=CHUNK_SIZE){constchunk=fileBuffer.slice(i,i+CHUNK_SIZE);client.send(chunk,4000,'server-ip',(err)=>{});}1.TCP/UDP编程UDP文件上传3.数据重组数据重组策略如下。(1)按序号存储接收到的分片数据。(2)检查所有分片数据是否都已接收。(3)按序合并分片数据恢复原始文件。接收端数据重组的示例代码:letreceivedBuffers=[];server.on('message',(msg)=>{receivedBuffers.push(msg);//收集分片数据if(msg.length<CHUNK_SIZE){//判断是否为最后一个分片数据constfullFile=Buffer.concat(receivedBuffers);fs.writeFileSync('received.jpg',fullFile);}});1.TCP/UDP编程【训练实例5-3】实现UDP文件上传与重组【操作要求】在文件夹Unit05中创建子文件夹case0503,在文件夹case0503中使用VSCode创建JavaScript文件send0503.js和receive0503.js,在发送端将大文件分片传输,在接收端按顺序重组。具体要求如下。丢包处理:实现超时重传机制确保数据完整性。顺序控制:使用序列号确保数据按序重组。流量控制:避免发送端数据发送速度过快导致接收端缓冲区溢出。边界处理:考虑最后一个分片数据的长度可能小于分片大小的情况。1.TCP/UDP编程【训练实例5-3】实现UDP文件上传与重组【实现过程】(1)在文件夹Unit05中创建子文件夹case0503。(2)在文件夹case0503中创建JavaScript文件send0503.js,在该文件中输入代码。从本书配套的教学资源中打开“训练实例5-3”对应的程序文件send0503.js,浏览相应代码。(3)在文件夹case0503中创建JavaScript文件receive0503.js,在该文件中输入代码。从本书配套的教学资源中打开“训练实例5-3”对应的程序文件receive0503.js,浏览相应代码。(4)运行程序与输出结果。打开第1个命令行窗口,该窗口中模拟文件接收与重组端,将文件夹case0503设置为当前文件夹,在文件接收与重组端的命令行执行“nodereceive0503.js”命令启动客户端。此时,接收端输出以下信息:服务器已启动,监听localhost:41234打开另一个命令行窗口,该窗口中模拟文件发送端,将文件夹case0503设置为当前文件夹,在文件发送端的命令行执行“nodesend0503.js”命令启动服务器。1.TCP/UDP编程2.HTTP编程HTTP编程是Node.js网络应用开发的核心能力,基于原生http模块实现双向通信。开发者可通过http.createServer()快速搭建HTTP服务器,处理客户端请求并返回响应;利用http.request()构造HTTP客户端,发起GET/POST等请求获取远程数据。请求解析需关注URL参数、Headers信息和请求体(通过流式拼接处理),结合url等工具模块实现精准拆解。借助Postman工具可模拟各类API场景,验证接口逻辑与数据交互。其事件驱动、非阻塞特性使Node.js尤其适合高并发的I/O密集型HTTP服务开发。2.HTTP编程使用原生http模块构建HTTP服务器Node.js的http模块提供了创建HTTP服务器和客户端的能力。使用http.createServer()可以快速搭建一个接收HTTP请求并返回响应的服务器。语法格式:http.createServer([requestListener])//等价于:http.creatServer(function(req,res){…})参数说明:requestListener(可选项):一个回调函数,每当有请求到达服务器时执行,该函数接收如下两个参数。req(http.IncomingMessage):表示HTTP请求的对象,包含请求头、URL等信息。res(http.ServerResponse):表示HTTP响应的对象,用于向客户端发送数据。2.HTTP编程【验证示例5-5】(1)创建JavaScript文件与编写程序代码。在文件夹Unit05中创建文件demo0505.js,在该文件中输入以下代码:consthttp=require('http');//创建服务器实例constserver=http.createServer((req,res)=>{//设置响应头:状态码200,内容类型为纯文本res.writeHead(200,{'Content-Type':'text/plain'});//发送响应内容res.end('Hello,World!\n');});//监听3000端口server.listen(3000,()=>{console.log('Serverrunningathttp://localhost:3000/');});2.HTTP编程【验证示例5-5】(2)运行程序与输出结果。在命令行中,设置文件所在文件夹Unit05为当前文件夹,然后执行以下命令:nodeserver.js命令行输出结果如下:Serverrunningathttp://localhost:3000/打开浏览器或使用工具(如curl)访问http://localhost:3000,可以看到信息“Hello,World!”。在命令行中按【Ctrl+C】组合键终止运行。关键代码解读如下。创建服务器:通过http.createServer()创建服务器实例,并传入回调函数处理请求。处理请求:回调函数中,使用res.writeHead(statusCode,headers)设置响应头,使用res.end()发送响应内容并结束请求。监听端口:调用server.listen()让服务器监听指定端口,启动服务。2.HTTP编程使用原生http模块构建http客户端使用http.request()可以创建一个HTTP客户端,向远程服务器发送请求并接收响应,通过事件监听、处理响应数据。语法格式:http.request(options[,callback])参数说明:①options(Object):配置请求的参数,常用属性如下。hostname(String):目标服务器的主机名,默认值为localhost。port(Number):目标服务器的端口号,默认值为80。path(String):请求的路径,默认值为/。method(String):HTTP请求方法,如GET、POST等,默认值为GET。headers(Object):请求头信息。②callback(Function):请求成功后的回调函数,接收一个http.IncomingMessage类型的参数,表示服务器响应。2.HTTP编程【验证示例5-6】关键代码解读如下。配置请求:通过options对象设置目标服务器地址、端口、请求方法等信息。发送请求:调用http.request()创建请求实例,并监听响应事件。处理响应:通过监听data事件收集响应数据,监听end事件处理完整响应。2.HTTP编程解析请求内容
在HTTP请求中,URL定位资源(含协议、域名、路径、查询参数等),Headers传递元数据(如Content-Type定义数据格式,Authorization处理鉴权),Body承载实际数据(如JSON、表单等)。解析时:URL用require('url').parse()拆解,Headers通过req.headers直接读取,Body需流式拼接,如req.on('data'),或使用中间件,如body-parser。三者协同完成请求的完整描述,是API开发的基础。2.HTTP编程解析请求内容
1.解析URLHTTP请求中的URL包含路径、查询参数等信息。Node.js的url模块可以方便地解析这些信息。2.HTTP编程解析请求内容
打开浏览器或使用工具(如curl)访问以下URL。①
基础路径:http://localhost:3000。服务器会返回以下内容:Path:/Query:{}②
带路径名:http://localhost:3000/products。服务器会返回以下内容:Path:/productsQuery:{}③
带查询参数:http://localhost:3000/users?id=123&name=Alice。Path:/usersQuery:{"id":"123","name":"Alice"}此时,服务器终端输出信息:1232.HTTP编程解析请求内容
2.解析Headers请求头包含客户端的额外信息,例如浏览器类型、接收的内容类型等,可通过req.headers访问。【验证示例5-8】在文件夹Unit05中创建文件demo0508.js,在该文件中输入以下代码:consthttp=require('http');constserver=http.createServer((req,res)=>{constheaders=req.headers;res.writeHead(200,{'Content-Type':'application/json'});res.end(JSON.stringify(headers,null,2));});server.listen(3000,()=>{console.log('Serverrunningathttp://localhost:3000/');});2.HTTP编程解析请求内容
3.解析Body对于POST、PUT等包含请求体的请求,需要通过监听data和end事件来收集完整数据。2.HTTP编程使用Postman测试API
Postman是一个流行的API测试工具,可以方便地发送各种HTTP请求(GET、POST等)并查看响应结果。Postman安装及使用步骤如下。首先从官网(网址为/)下载并安装Postman,然后按以下步骤操作。(1)创建请求。打开Postman,单击“新建”按钮,选择“HTTP请求”选项,创建一个新请求,选择HTTP方法,例如GET、POST,输入请求URL,例如http://localhost:3000。(2)设置请求头。在“Headers”选项卡中添加键值对,例如Content-Type:application/json。(3)设置请求体(针对POST/PUT请求)。在“Body”选项卡中选择数据格式,例如raw、JSON。输入请求体内容,如{"name":"李明","age":23}。(4)发送请求。单击“发送”按钮发送请求,查看响应结果,如响应状态码、Headers和Body等。3.RESTfulAPI设计规范1.HTTP方法的规范应用HTTP方法定义了对资源的操作类型,需遵循“动词+名词”的语义化原则。(1)GET:获取资源(只读操作)。GET用于获取单个或多个资源的信息,不修改服务器数据。①
获取用户列表:GET/api/users。②
获取单个用户的信息:GET/api/users/123(123为用户ID)。示例代码(Flask框架):@app.route('/users/<int:user_id>',methods=['GET'])defget_user(user_id):#根据user_id查询用户user=db.get_user(user_id)returnjsonify(user),200URL参数:通过查询字符串传递过滤条件,如/users?page=1&limit=10。HTTP方法应用与资源命名约定3.RESTfulAPI设计规范(2)POST:创建资源。POST用于提交数据新建一个资源。例如:创建一个新用户。示例代码:@app.route('/users',methods=['POST'])defcreate_user():#从请求体获取JSON数据user_data=request.get_json()#创建用户逻辑returnjsonify({"id":123}),201#201表示创建成功请求体:需包含资源的完整属性,例如{"name":"张珊","email":"zhangshan@"}。HTTP方法应用与资源命名约定3.RESTfulAPI设计规范(3)PUT:全量更新资源。PUT用于覆盖更新整个资源。例如:更新ID为123的用户信息。示例代码:@app.route('/users/123',methods=['PUT'])defupdate_user():user_data=request.json#全量更新用户信息return"更新成功",200请求体应包含完整用户数据,若请求体缺少部分字段,旧数据会被清空(需确保客户端传递完整数据)。HTTP方法应用与资源命名约定3.RESTfulAPI设计规范(4)PATCH:部分更新资源。PATCH用于仅更新资源的部分属性。例如:修改用户邮箱。示例代码:@app.route('/users/123',methods=['PATCH'])defpatch_user():update_data=request.json#仅更新请求体中存在的字段return"部分更新成功",200HTTP方法应用与资源命名约定3.RESTfulAPI设计规范(5)DELETE:删除资源。DELETE用于删除指定资源。例如:删除ID为123的用户。示例代码:@app.route('/users/123',methods=['DELETE'])defdelete_user():#执行删除操作return"",204#204表示无内容返回HTTP方法应用与资源命名约定3.RESTfulAPI设计规范2.资源命名规范(1)用名词复数表示资源集合。正确用法示例:/users(用户集合)、/products(商品集合)。错误用法示例:/getUsers(避免在URL中使用动词)。(2)全小写字母,用连字符分隔。正确用法示例:order-items。(3)用ID标识单个资源。正确用法示例:/users/123(ID为123的用户)、/products/456(ID为456的商品)。(4)分层命名结构体现资源关联关系。正确用法示例:/users/123/orders(获取用户123的订单列表)。(5)避免多级参数,用路径参数替代。正确用法示例:GET/api/products/123/reviews(获取产品123的评论)。错误用法示例:GET/api/reviews?productId=123。HTTP方法应用与资源命名约定3.RESTfulAPI设计规范1.常见状态码分类与实例状态码用于表示请求的处理结果,需要符合HTTP语义,避免自定义错误码(如“50001”)。(1)成功类(2xx)。①200OK:请求成功,返回资源数据,例如GET请求成功获取用户信息,或PUT/PATCH/DELETE请求返回操作结果。②201Created:资源创建成功,例如POST创建新资源后返回一个指向新资源的URL。其并不强制返回资源数据。③204NoContent:请求成功但无返回内容,例如DELETE删除资源后。状态码的合理使用3.RESTfulAPI设计规范(2)客户端错误类(4xx)。①400BadRequest:请求参数错误,如缺少必填字段、参数缺失、格式错误(如JSON解析失败)。错误信息:{"error":"参数错误","message":"缺少name字段","code":"INVALID_PARAM"}②401Unauthorized:请求缺少认证信息(如令牌)或令牌无效,例如,未携带令牌访问需要登录的接口,返回401,提示“需要登录”。③403Forbidden:用户已认证,但权限不足或无权限操作资源,例如,普通用户尝试访问管理员接口,用户A尝试删除用户B的订单(非自己的订单),返回403。④404NotFound:资源不存在,如请求/users/999,ID不存在,返回404。状态码的合理使用3.RESTfulAPI设计规范(3)服务器错误类(5xx)。500InternalServerError:服务器内部错误,如代码异常、数据库连接失败。错误信息:{"error":"服务器错误","message":"请稍后再试"}状态码的合理使用3.RESTfulAPI设计规范2.状态码使用原则(1)避免过度细分:优先使用标准状态码,如400已涵盖“参数错误”,无须自定义40001。(2)结合响应体说明错误:状态码需配合JSON响应体,如{"error":"未授权","message":"令牌失效"}。(3)区分401与403两个状态码。401:未认证(需先认证)。403:已认证但无权限(如普通用户访问/admin/settings)。(4)500错误需隐藏技术细节,生产环境只需返回简化信息。状态码的合理使用4.实时通信WebSocket是HTML5提供的全双工通信协议,通过一次HTTP握手建立持久连接,是一种在单个TCP连接上进行全双工通信的协议,允许客户端和服务器之间实时交换数据。Node.js的ws库是实现WebSocket通信的常用选择之一。WebSocket协议头为ws://或wss://。主要方法如下。(1)服务器端方法。WebSocket.Server({options}):创建WebSocket服务器,options包含端口等信息。ws.on('connection',callback):监听新连接事件。ws.send(data):向客户端发送数据,支持字符串/二进制。(2)客户端方法。newWebSocket(url):创建WebSocket客户端。ws.onopen:连接成功回调。ws.onmessage:接收消息回调。ws.onclose:连接关闭回调。WebSocket服务器与客户端实现4.实时通信Socket.IO是一个基于WebSocket的实时通信库,Socket.IO封装了WebSocket,提供了自动重连、广播、房间管理、二进制传输等高级功能。核心方法说明如下。(1)房间管理。socket.join(roomName):加入指定房间。socket.leave(roomName):离开指定房间。socket.emit():发送给当前客户端。(2)消息广播。io.emit('event',data):向所有客户端广播。socket.broadcast.emit('event',data):向除自己外的其他客户端广播。io.to(roomName).emit('event',data):向指定房间广播。Socket.IO集成4.实时通信【验证示例5-12】(1)项目准备。创建文件夹:在文件夹Unit05中创建子文件夹demo0512,并设置该文件夹为当前文件夹。初始化项目:在终端中执行“npminit–y”命令初始化一个新的Node.js项目,这将创建一个package.json文件。安装依赖:执行以下命令安装Express和Socket.IO。npminstallexpresssocket.io(2)创建JavaScript文件与编写程序代码。在文件夹demo0512中创建文件server0512.js,在该文件中输入代码。从本书配套的教学资源中打开“验证示例5-12”对应的程序文件server0512.js,浏览相应代码。在文件夹demo0512中创建文件index.html,在该文件中输入以下主体代码:Socket.IO集成4.实时通信Socket.IO集成4.实时通信(3)运行程序与输出结果。①
启动服务器:在终端中执行以下命令启动服务器。nodeserver0512.js如果一切正常,将看到浏览器控制台输出“服务器运行在端口3000”。②
访问客户端页面:打开浏览器,访问http://localhost:3000。③
查看控制台输出:打开浏览器的开发者工具(按【F12】键;或右击,在弹出的快捷菜单中选择“检查”命令),在浏览器控制台中将看到以下信息:已连接到服务器收到消息:fwLrM7-ZdCmafhn1AAAB加入了房间此时,在服务器终端可以看到以下信息:用户已连接fwLrM7-ZdCmafhn1AAAB加入房间:chat-roomSocket.IO集成4.实时通信(3)运行程序与输出结果。①
启动服务器:在终端中执行以下命令启动服务器。nodeserver0512.js如果一切正常,将看到浏览器控制台输出“服务器运行在端口3000”。②
访问客户端页面:打开浏览器,访问http://localhost:3000。③
查看控制台输出:打开浏览器的开发者工具(按【F12】键;或右击,在弹出的快捷菜单中选择“检查”命令),在浏览器控制台中将看到以下信息:已连接到服务器收到消息:fwLrM7-ZdCmafhn1AAAB加入了房间此时,在服务器终端可以看到以下信息:用户已连接fwLrM7-ZdCmafhn1AAAB加入房间:chat-room⑤
多客户端测试。在多个浏览器标签中打开http://localhost:3000,从一个标签发送消息,所有标签都应收到通知。关闭HTML文件index.html后,服务器端的命令行窗口中会输出信息“用户已断开连接”。4.实时通信1.WebSocket鉴权WebSocket鉴权用于在握手阶段验证身份。WebSocket鉴权是确保只有合法用户才能建立实时连接的关键机制,其核心思路是在连接建立前验证身份。2.心跳机制心跳机制用于检测连接是否存活,防止因网络问题(如连接超时)导致的僵死连接。关键参数如下。ping()/pong():心跳检测方法。heartbeatInterval:心跳间隔时间。heartbeatTimeout:超时断开阈值。WebSocket鉴权与心跳机制4.实时通信【操作要求】在文件夹Unit05中创建子文件夹case0504,在文件夹case0504中使用VSCode创建JavaScript文件websocket-server0504.js,在该文件中编写程序代码创建支持广播功能的WebSocket服务器。【实现过程】(1)在文件夹Unit05中创建子文件夹case0504,在文件夹case0504中创建JavaScript文件websocket-server0504.js,在该文件中输入以下代码:【训练实例5-4】实现WebSocket通信4.实时通信(2)在文件夹case0504中创建网页文件client0504.html,在该文件中编写代码。从本书配套的教学资源中打开“训练实例5-4”对应的网页文件client0504.html,浏览相应代码。(3)运行程序与输出结果。①
在终端执行以下命令安装ws库:npminstallws②
在终端执行以下命令:nodewebsocket-server0504.js终端会输出以下信息:WebSocketserverrunningonws://localhost:8080③
打开浏览器浏览client0504.html,按【F12】键打开浏览器的控制台。初始状态,页面显示信息“未连接”。【训练实例5-4】实现WebSocket通信4.实时通信④
测试连接。单击“连接”按钮建立WebSocket连接,此时页面中显示信息“已连接到服务器”。在输入框中输入消息“你好,服务器!”单击“发送”按钮或按【Enter】键。在自己的聊天窗口中会显示以下信息:你好,服务器!在其他客户端的聊天窗口中会显示以下信息:你好,服务器!自己发送的消息文字颜色为绿色,收到的消息文字颜色为蓝色。⑤
多客户端测试。打开多个浏览器窗口或标签页,每个标签页都会作为独立的客户端。当一个客户端发送消息时,其他客户端都会收到广播。【训练实例5-4】实现WebSocket通信编写程序,创建简单HTTP服务器,主要实现以下功能。(1)当访问根路径(/)时,返回状态码200和纯文本内容“HomePage”。(2)访问/api/data路径时,返回状态码200和JSON格式的数据{"message":"HellofromAPI"}。(3)对于其他未定义的路径,返回状态码404和“NotFound”。任务5-1创建与运行简单HTTP服务器任务描述任务5-1创建与运行简单HTTP服务器任务实施1.创建JavaScript文件与编写程序任务5-1创建与运行简单HTTP服务器任务实施2.运行程序与输出结果(1)启动服务器。在终端,先切换到文件task0501.js所在的文件夹,然后执行以下命令:nodetask0501.js如果一切正常,会看到输出信息“Serverrunningonhttp://localhost:3000”。(2)测试服务器。可以通过以下两种方式对服务器进行测试。①
使用浏览器访问。打开浏览器,访问http://localhost:3000,网页中会显示“HomePage”。访问http://localhost:3000/api/data,网页中会显示{"message":"HellofromAPI"}。访问其他路径,例如http://localhost:3000/unknown,网页中会显示“NotFound”。任务5-1创建与运行简单HTTP服务器任务实施②
使用命令行工具测试。使用以下curl命令进行测试。#测试主页curlhttp://localhost:3000#测试APIcurlhttp://localhost:3000/api/data#测试404curlhttp://localhost:3000/unknown(3)终止服务器。在终端中,按【Ctrl+C】组合键即可终止服务器。编写程序,创建简易静态文件服务器,主要实现以下功能。(1)静态文件服务。从指定的public目录读取文件并返回给客户端,自动处理根路径/请求,默认返回index.html,能够支持多种文件(如HTML、CSS、JS、图片等)。(2)MIME类型识别。根据文件扩展名自动设置正确的Content-Type头,预定义常见文件类型的MIME映射,例如.html→text/html。(3)错误处理增强。404错误:文件不存在时返回专门的404响应。500错误:处理其他服务器错误(如权限问题、磁盘故障)。控制台记录详细错误日志,便于调试。任务5-2创建与运行简易静态文件服务器任务描述任务5-2创建与运行简易静态文件服务器任务实施任务5-3实现简单的RESTfulAPI服务器任务描述编写程序,创建一个简单的RESTAPI服务器,通过原生http模块实现RESTfulAPI功能,提供REST服务。该服务器支持以下两个端点。(1)GET/api/users:获取所有用户。(2)GET/api/users/:id:获取单个用户。任务5-3实现简单的RESTfulAPI服务器任务实施1.创建JavaScript文件与编写程序在文件夹Unit05中创建JavaScript文件task0503.js,在该文件中编写代码。从本书配套的教学资源中打开“实战任务5-3”对应的程序文件task0503.js,浏览相应代码。2.运行程序与输出结果(1)启动服务器。在终端中执行以下命令:nodetask0503.js此时,会看到输出信息“Serverrunningonport3000”。(2)通过终端执行命令测试API。可以在终端执行不同命令,使用以下方式之一测试API。任务5-3实现简单的RESTfulAPI服务器①
获取所有用户。在终端中执行以下命令:curlhttp://localhost:3000/api/users预期响应:[{"id":1,"name":"张珊"},{"id":2,"name":"李斯"}]。②
获取单个用户(有效ID)。在终端中执行以下命令:curlhttp://localhost:3000/api/users/1预期响应:{"id":1,"name":"张珊"}。③
获取单个用户(无效ID)。在终端中执行以下命令:curlhttp://localhost:3000/api/users
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026汽车改装行业市场需求调研投资规划布局方案
- 智能化保险产品设计与用户行为分析-第7篇
- 党建笔试题及答案深度解析
- 2026中国智能家居设备生产企业市场现状分析及投资布局评估报告
- 2026石油钻采设备行业市场供需现状分析国际形势投资战略研究报告
- 2026汽车制造行业市场供需发展趋势及投资前景分析研究报告
- 2026青岛智能机器人核心算法产业市场动态投资评估规划分析概要
- 2026媒体娱乐行业市场供需现状及发展策略分析报告
- 2026中国智能农业种植技术与农产品供应链优化研究
- 2026中国医疗设备研发生产行业市场供需调研及投资前景评估规划报告
- 海洋工程作业安全预案
- 2025-2026学年北师大版(2024)小学数学二年级上册(全册)教学设计(表格版)(附目录P255)
- 锂电池出口知识培训课件
- DB36∕T 1296-2020 城市消防物联网大数据应用平台接口规范
- 公建工程交付指南(第三册)
- 工厂安全生产环保操作规程
- 钻井队用电安全培训
- JG/T 3055-1999基桩动测仪
- 人教版数学九年级上册第一单元测试卷(附答案)
- 民事诉讼法戴鹏讲义
- 1.一的法则(第一二三卷-第1-79场)
评论
0/150
提交评论