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()这个方法是结束相应内容的书写
- nodejs--http
- nodejs-http
- NodeJS-http
- NodeJS http.ServerRequest & http.ServerResponse
- NodeJS http.ClientRequest & http.ClientResponse
- nodejs--http篇
- nodejs 创建http客户端
- nodejs中的HTTP请求
- Nodejs http、url模块
- nodejs http 发送请求
- nodejs 创建http server
- http服务器(nodejs)
- nodejs http响应两次
- nodejs模块-http
- nodejs API之HTTP
- nodejs-http服务
- nodejs-http客户端
- nodejs http 发送请求
- NSLayoutConstraint小记
- Fragment与Activity的交互
- NoSQL浅谈
- 编程规范
- 网络编程 01
- nodejs-http
- ExtJS 布局系统详解
- Probabilistic Robotics读书笔记(一)
- PHP中文处理 中文字符串截取(mb_substr)和获取中文字符串字数
- 关于openstack,cloudstack,Eucalyptus对比分析
- Sketch MAC破解
- js 初步了解闭包
- mybaits java后台返回自增长的id
- bzoj 3489 A simple rmq problem 可持久化树套树