nodejs-http

来源:互联网 发布:淘宝卖家贴吧怎么引流 编辑:程序博客网 时间:2024/06/04 19:32

创建http服务器

var server=http.createServer([callback])

callback:function(request,response){

//....

}

回调函数表示当接受到客户端请求要做的处理

若不指定callback,可以绑定request事件,表示当客户端连接做的处理

server.on("request",function(request,response){

//.....

})

创建好服务器了,得告知服务器监听什么端口,ip、等待队列的个数、回调函数等。

server.listen(port,[host],[backlogs],[callback])

port:监听的端口,若为0随机分配一个

host;监听的ip,不指定,那么监听所有的ipv4客户端ip

backlogs:等待队列中客户端最大连接数默认511

callback:监听成功触发的回调函数

我们不指定回调函数时候,可以用server.on(""listening",function({}))

我们简单写一个http服务器

var http=require("http");
var server=http.createServer();
server.on("request",function(req,res){
      //接受到客户端请求做处理
})
server.on("listening",function(){
    console.log("开始监听");
})
server.listen(1111,'192.168.0.3')

运行结果

关闭服务器

我们可以用sever.close(),当服务器调用close方法时候,会触发close事件

我们在监听成功后调用close方法

代码

var http=require("http");
var server=http.createServer();
server.on("request",function(req,res){
      //接受到客户端请求做处理
})
server.on("listening",function(){
    console.log("开始监听");
    //调用关闭服务器
    server.close();
})
server.on("close",function(){
   console.log("服务器关闭")
})
server.listen(1111,'192.168.0.3')

运行结果


当运行出错服务器会触发error事件

修改上面代码,colse()事件去掉,新绑定error事件,代码如下

var http=require("http");
var server=http.createServer();
server.on("request",function(req,res){
      //接受到客户端请求做处理
})
server.on("listening",function(){
    console.log("开始监听");
    //调用关闭服务器
    //server.close();
})
server.on("close",function(){
   console.log("服务器关闭")
})
server.on("error",function(err){
   if(err.code="EADDRINUSE"){
      console.log("地址端口已经被用")
   }  
 })
server.listen(1111,'192.168.0.3')

我们一个cmd窗口运行正常,在打开另一个cmd窗口,创建服务器,效果如下


默认情况下,客户端与服务器每进行一次http操作,都会建立一个连接,操作完毕,关掉连接,我们可以用content:keep-alive(http1.1支持),让这个连接是长连接。

每次连接上server会触发connnection事件

server.on("connection" ,function(socket){

})

修改代码如下

var http=require("http");
var server=http.createServer();
server.on("request",function(req,res){
      //接受到客户端请求做处理
})
server.on("listening",function(){
    console.log("开始监听");
    //调用关闭服务器
    //server.close();
})
server.on("close",function(){
   console.log("服务器关闭")
})
server.on("error",function(err){
   if(err.code="EADDRINUSE"){
      console.log("地址端口已经被用")
   }  
 })
 server.on("connection",function(socket){
    console.log("%s客户端连接上了",socket.remoteAddress);
 })
server.listen(1111,'192.168.0.3')

运行结果为

为什么触发了2次connection事件呢,原因是一个是客户端发送的请求,另一个是浏览器图标请求


我们可以使用setTimeout(ms,[callback])函数来设定服务器超时时间,当超时了,该链接就废弃了,要想做什么操作就得在连接一次,callback是超时之后要做的处理,我们也可以不用这个回到函数,应为在server中,超时会触发timeout事件,

server.on("timeout",funcion(socket)){})

代码

var http=require("http");
var server=http.createServer();
server.on("request",function(req,res){
      //接受到客户端请求做处理
})
server.on("listening",function(){
    console.log("开始监听");
    //调用关闭服务器
    //server.close();
})
server.on("close",function(){
   console.log("服务器关闭")
})
server.on("error",function(err){
   if(err.code="EADDRINUSE"){
      console.log("地址端口已经被用")
   }  
 })
 server.on("connection",function(socket){
    console.log("%s客户端连接上了",socket.remoteAddress);
 })
 server.setTimeout(10000);
 server.timeout=5000;
 server.on("timeout",function(socket){
   console.log("超时了,server设定的超时时间是%s",server.timeout)
 })
server.listen(1111,'192.168.0.3')

运行结果如下(第一个运行结果代码中没有 server.timeout=5000;)


可见我们修改服务器的超时时间可以用setTimeout函数和server.timeout=10000(timeout这个属性)


获取客户端请求信息

创建http服务器时候指定的回调函数或者服务器触发的request事件,第一个参数我客户端请求流对象,我们可在这个对象中获取客户端发送的消息

如当客户端发送消息时候,可以从请求流中读取数据,触发data事件,读取完毕是触发end事件

这个请求流中还包含其他的属性

method:指定客户端请求服务器用的方法postputgetdelete

url:客户端请求的URl,要求服务器返回什么样的数据

http Version:http版本

headers:请求头信息

trailers:请求头信息,一般在end方法调用完之后传到服务器上

socket:监听的socket端口对象


我们把客户端请求信息写入到一个文件里

var http=require("http");
var fs=require("fs");
var server=http.createServer();
server.on("request",function(req,res){
      //接受到客户端请求做处理
      if(req.url!="/favicon.ico"){
         var opation={flags:"a",
                      encoding:"utf-8"
                      }
         var file=fs.createWriteStream('./request.txt',opation);
         file.write("客户端请求的方法是"+req.method+"\r\n")
         file.write("客户端请求的url是"+req.url+"\r\n")
         file.write("客户端请求的头信息是"+JSON.stringify(req.headers)+"\r\n")
         file.write("客户端请求的trailers是"+req.trailers+"\r\n")
         file.write("客户端请求的http版本是"+req.http Version+"\r\n")
        
      }
})
server.on("listening",function(){
    console.log("开始监听");
    //调用关闭服务器
    //server.close();
})
server.on("close",function(){
   console.log("服务器关闭")
})
server.on("error",function(err){
   if(err.code="EADDRINUSE"){
      console.log("地址端口已经被用")
   }  
 })
 server.on("connection",function(socket){
    console.log("%s客户端连接上了",socket.remoteAddress);
 })
 
server.listen(1111,'192.168.0.3')

执行结果


下面我们做一个简单的form表单提交

<!DOCTYPE html>
<html>
   <head>
   <meta charset="UTF-8">
     <title>nodejs提交表单</title>
    
   </head>
   <body>
      <form id="form1" action="http://192.168.0.3:1111/" method="post">
      
          姓名:<input type="text" name="name" value="宋茂林"></input></br>
          密码:<input tyoe="password" name="password" value="111111"></input>
                <input  type="submit" value="提交"></input>
      </form>
   
   </body>
</html>

服务器代码

var http=require("http");
var fs=require("fs");
var server=http.createServer();
server.on("request",function(req,res){
      //接受到客户端请求做处理
      if(req.url!="/favicon.ico"){
        // var opation={flags:"a",
        //              encoding:"utf-8"
         //             }
        // var file=fs.createWriteStream('./request.txt',opation);
        // file.write("客户端请求的方法是"+req.method+"\r\n")
        // file.write("客户端请求的url是"+req.url+"\r\n")
        // file.write("客户端请求的头信息是"+JSON.stringify(req.headers)+"\r\n")
        // file.write("客户端请求的trailers是"+req.trailers+"\r\n")
        // file.write("客户端请求的http版本是"+req.http Version+"\r\n")
        req.on("data",function(data){
            console.log("客户端法搜昂的数据"+data);
             console.log("客户端法搜昂的数据"+decodeURIComponent(data));
        })
      }
})
server.on("listening",function(){
    console.log("开始监听");
    //调用关闭服务器
    //server.close();
})
server.on("close",function(){
   console.log("服务器关闭")
})
server.on("error",function(err){
   if(err.code="EADDRINUSE"){
      console.log("地址端口已经被用")
   }  
 })
 server.on("connection",function(socket){
    console.log("%s客户端连接上了",socket.remoteAddress);
 })
 
server.listen(1111,'192.168.0.3')


点击提交按钮 吧form表单的信息提交http服务器,打印data


url转换。查询字符串转换

查询字符串:

url中?后面#前面,若没有#那么到最后

如http://loacalhost:8080/his/ecgcontroller?name=1&password=2#qqwer

查询字符串为name=1&password=2

使用queryString的parse方法,把查询字符串转成对象

querystring.parse(str,[sep],[eq],[optitions])

代码

var querystring=require("querystring");
var url="name:1&pwd:2";
var url1="name=1!pwd=2";
var url2="name:1!pwd:2";
var url3="name=1&name=2&pwd=3"
var s=querystring.parse(url,'&',':');
console.log(s);
var s1=querystring.parse(url,'&',':',{maxKeys:1});
console.log(s1);
var s2=querystring.parse(url1,'!','=');
var s3=querystring.parse(url1,'!','=',{maxKeys:1});
var s4=querystring.parse(url2,'!',':');
var s5=querystring.parse(url2,'!',':',{maxKeys:1});
var s6=querystring.parse(url3,'&','=');
var s7=querystring.parse(url3,'&','=',{maxKeys:1});
console.log(s2);
console.log(s3);
console.log(s4);
console.log(s5);
console.log(s6);
console.log(s7);

执行结果



使用querystring.stringify(obj,[sep],[eq])转成查询字符串

console.log(querystring.stringify(s1,'&',':'));

执行结果多一个name:1

url模块

url.parse(str)把字符串转成对象

url.format(obj)把对象转成字符串

url.resovle(from,to),这个与path.resolve(from,to)类似


发送服务端相应数据

创建服务器的回调函数或者服务器监控的connection事件,他们的第二个参数为相应客户端流对象

//写头信息

response.writeHead(statusCode,[状态吗的描述],[服务端创建的响应头对象])

也可以response.setHeader(name,value)

response.getHeader(name)取设置的header值

response.removeHeader(name)删除设置的header值

response还有一个headersSent属性,表示是否发送了head信息,发送为true,没有为fasle

writehead与setHeader区别,前者设置完直接发送,后者第一次write时候发送

response有statusCode属性可以response.statusCode=200设定其值,不用writeHead里面写

response有sentDate一般表示发送连接时间,response.sentDate=false我们在请求头信息看到没有这个属性了。


response.addTrailers(heads)

我们可以在最后write()方法后添加这个方法,写头信息

response.write()这个方法是写入数据的。

response.end()这个方法是结束相应内容的书写

0 0
原创粉丝点击