鹦哥

导航

 

         通过Node模块,我们可以实现客户端和服务器端。这篇文章主要研究如何利用http和一些相关模块构建客户端和服务器端代码。读完本文,将能够实现client向server发送数据,而server将数据原样返回。

***********************************************************************************

服务器端

          首先介绍几个方法。

  • http的createServer方法

           var server = http.createServer(requestListener(request,response)),这个方法做了两件事情:1. 创建服务器;2.定义了收到请求后(请求到来时)服务器如何处理,request指的是客户端发过来的请求(输入流),response指服务器对客户端的响应(输出流)。

          通过request, 我们可以得到请求的相关信息。request.method代表请求的方法名(post / get / delete / put...), request.url代表请求的路径名(不包含hostname和port),request.headers返回请求头部对象,而request.httpVersion是请求的http版本号。request.headers里包含这十分丰富的信息,例如: 

{ host: 'localhost:8000', //主机名和端口号
  connection: 'keep-alive', 
  'cache-control': 'max-age=0',//缓存相关
  accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', //客户端能够接收的媒体类型(MIME)和优先级,默认为1;表示优先接受text/html、application/  xhtml+xml、image/webp类型(q=1),其次为application/xml类型(q=0.9),如果这些都没有,那就随便什么类型了(q=0.8)
'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.73 Safari/537.36',//客户端类型,表示为chrome桌面板 'accept-encoding': 'gzip, deflate, sdch',//客户端支持的内容压缩编码格式 'accept-language': 'en-US,en;q=0.8',//客户端使用的语言及其优先级 }

         通过response,可以设置响应部分。response.writeHead(statusCode, statusText, options)方法可以设置响应状态码和描述信息,在options中可以添加自定义头部或者给头部赋值。writeHead和setHeader不同,前者是直接把响应头部发送出去了,而后者只是设置,所以一旦使用了writeHead,接下来想再次修改头部就不可能了,比如在writeHead之后想要通过getHeader("name")或者removeHeader("name")是不可能成功的,因为已经把头发送出去了,如果真的想这么做,就请用setHeader。用法如下:

         response.writeHead(200, "quite good", {"name":"test", “content-type":"application/json"});                                       response.setHeader("name","test");   response.setHeader("age","16")

writeHead还有一个有用的用法,就是设置重定向。response.writeHead(301, "moved forever", {location: "http://www.baidu.com"}), 如果客户端访问服务器的地址,就会被导航到baidu。

  •  server的listen方法

         server.listen(port, hostname, queue, callback),port是服务器监听的端口号,hostname为服务器主机名,默认为localhost,queue为队列中等待的连接数上限(默认为511),callback为服务器成功启动(服务器启动时)的回调函数。一般情况下,hostname和queue就采用默认值。

*****************************************************************************************

 客户端

        客户端要完成的是向服务器发送请求。这种利用node构建客户端的方式其实是把node作为中间层,一个好处是避免了前端请求的跨域问题。在进一步开始之前,先学习一下http.request方法。

     var client =  http.request(options,callback);options是一个对象,常用的属性包括:

      hostname: 表示请求网站的主机名或者域名,默认为localhost

      port:  服务端口号

     method: http方法,get, post,

     path: 路径名

     headers:   请求头

而callback是一个回调函数,参数response是一个可读流,可以用可读流的data事件取出响应体。

和createServer相对应地,http.request返回一个客户端类型client,client是可写流,可以通过可写流的write方法写入具体的内容,也可以用end方法结束写入client。

       最后,我们用以上提到的方法完成:客户端向服务器发送json对象,服务器读取后再把对象返回给客户端。

  客户端代码为:

var http=require('http');

var options={
    method:"get",
    hostname:"localhost",
    port:9090,
    path:"/user",
    headers:{
        "Content-Type":"application/json"
    }
}
var client = http.request(options,function(response){ //client是一个可写流
    response.on("data",function(data){  //读取响应体数据
        console.log(data.toString("utf-8"));//将二进制数据转化成字符串
    })
});
client.write(JSON.stringify({"name":"Lily"}));//给请求体写数据,数据类型为buffer或者string
client.end();//结束写入请求体并发送请求

 

 服务器端代码为:

var http = require("http");
var server = http.createServer(function (req, res) {
    if (req.method == "POST" && req.url == "/user") {//向user提交数据
        req.on("data", function (data) {
            var str = "request content is " + data;//这里因为有字符串拼接,所以data就直接由二进制转为字符串了
            res.write(str);
            res.end();
        });
    } else { //请求路径不是user,则返回404
        res.statusCode = 404;
        res.end();
    }
});
server.listen(9090, "localhost", 511, function () {
    console.log("server starts");
})

 

posted on 2016-08-13 00:21  鹦哥  阅读(369)  评论(0编辑  收藏  举报