Node.js网络通信方式:Http协议

上篇介绍了UDP协议通信,本篇介绍Http协议:一种通用、无状态的应用层协议。

服务端代码如下:

/**
 * Http 服务端
 */
const http = require("http");
const url = require("url");

const querystring = require('querystring');

//服务器创建
const server = http.createServer((req,res)=>{
    let reqUrl = decodeURI(req.url);
    reqUrl = url.parse(reqUrl);
    console.log("web 客户端url="+req.url);

    let data = "";
    req.on("data",(chunk)=>{
        data += chunk;
    });
    req.on("end",()=>{
        data = decodeURI(data);
        let dataObj = querystring.parse(data);
        console.log("web 客户端数据:",dataObj);

        res.writeHead(200,{"Content-Type":"text/html;charset=utf-8"});
        res.write("Hello!");
        res.end("响应完毕\n");
    });

   
});

server.listen(8080,()=>{
    console.log("服务器已经启动!");
});

server.on("error",(err)=>{
    console.error("服务器错误:",err.message);
});

//服务器关闭
// server.close();

客户端代码如下:

/**
 * Http请求客户端
 */
const http = require("http");

//--------Post请求【键值对形式表单】-------------------
const querystring = require("querystring");
//将要提交的数据转换为查询字符串
const postData = querystring.stringify({"msg":"你好!我是Http客户端"});
//发送请求设置
const options = {
    hostname:"127.0.0.1",
    port:8080,
    path:"/upload",
    method:"POST",
    headers:{
        'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8',
        'Content-Length': Buffer.byteLength(postData)
    }
}

//创建Post请求
const req = http.request(options,(res)=>{
   console.log("服务器返回状态码:",res.statusCode);
   console.log("服务器返回响应头:",JSON.stringify(res.headers));
   let data ="";
   res.setEncoding("utf8");
   res.on("data",(chunk)=>{
       data += chunk;
   });
   res.on("end",()=>{
       console.log("服务器返回响应体数据:"+data);
   }); 
});

req.on("error",(err)=>{
   console.error("客户端错误:",err.message);
   if(err)
   {
       req.destroy();//终止当前请求
   }
});

req.on("abort",()=>{
    console.log("客户端终止请求!");
});

req.on("timeout",()=>{
    console.log("客户端请求超时!"); 
});

req.setTimeout(3000);
//post请求携带的参数是类似键值对对象组
req.write(postData);
req.end();


//----------------Get请求【以?分割URL和传输数据,参数之间以&相连】----------
const options2 = {
    hostname: '127.0.0.1',
    port: 8080,
    path: encodeURI('/index.html?page=12&stats=打开')   
};

const req2 = http.get(options2,(res)=>{
    let data = "";
    res.on("data",(chunk)=>{
       data += chunk; 
    });
    res.on("end",()=>{
        console.log("服务器返回响应体数据:",data);
    });     
});

req2.on("error",(err)=>{
    console.log("出现错误:",err.message);
});

运行结果如下

【服务端】

【客户端】

 

Node.js内置了http模块,因此无需安装第3方的包。http常用请求方式:get与post,它们的主要区别在于携带请求参数的不同,前者是拼接在url后,后者是以表单键值对象方式。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Data菌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值