nodejs实战之简单实现服务器端(顺便讲一下URL)
来源:互联网 发布:淘宝9活动都有什么 编辑:程序博客网 时间:2024/05/21 10:55
服务器端的实现
啥都不说,先上代码
现在好像都用express来实现吧,但是对于原理的理解还是要掌握的,下面一段代码就是一个简单实现node服务器端的例子,客户端可以通过获取本地的资源。
这里说一下使用了两个模块,fs和url,不用install,是node自带的
fs用于文件的读写
url用于解析统一资源定位路径
var http=require('http')var fs=require('fs') var server=new http.Server()server.listen(8000)server.on('request',function(req,res){ //console.dir("req"+req.url) var url=require('url').parse(req.url) //console.dir("res"+res) if(url.pathname==='/test/delay'){ var delay=parseInt(url.query)||2000 res.writeHead(200,{"Content-Type":"text/plain;charset=UTF-8"}) res.write("Sleeping for "+delay+"milliseconds....") setTimeOut(function(){ res.write("done.") res.end() },delay) } else if(url.pathname==="/test/mirror"){ res.writeHead(200,{"Content-Type":"text/plain;charset=UTF-8"}) res.write(req.method+""+req.url+"HTTP/"+req.httpVersion+"\r\n") for(var h in req.headers){ res.write(h+":"+req.headers[h]+'\r\n') } res.write("\r\n") } else{ var filename=url.pathname.substring(1) console.log("pathname:"+url.pathname) console.log("filenamee:"+filename) var type switch(filename.substring(filename.lastIndexOf(".")+1)){ case "html": case "htm":type="text/html; charset=UTF-8";break case"js":type="application/javascript;charset=UTF-8";break case"css":type="text/css; charset=UTF-8";break case"txt":type="text/plain; charset=UTF-8";break case "manifest":type="text/cache-manifest; charset=UTF-8";break default :type="application/octet-stream;charset=UTF-8";break } fs.readFile(filename,function(err,content){ if(err){ res.writeHead(404,{ "content-Type":"text/plain;charset=UTF-8" }) res.write(err.message) res.end() } else{ res.writeHead(200,{ "content-Type":type }) res.write(content) res.end() } }) }})
URL
下面严肃的讲一下URL
引自百度百科:
基本URL包含模式(或称协议)、服务器名称(或IP地址)、路径和文件名,如“协议://授权/路径?查询”。完整的、带有授权部分的普通统一资源标志符语法看上去如下:协议://用户名:密码@子域名.域名.顶级域名:端口号/目录/文件名.文件后缀?参数=值#标志
这么一个url:’http://user:pass@host.com:8080/p/a/t/h?query=string#hash’
我们一眼就知道它的意思:
请求的协议是: ‘http:’
URL中的授权信息: ‘user:pass’
主机名: ‘host.com’
端口号: ‘8080’
查询字段:’?query=string’
路径名: ‘/p/a/t/h’
哈希值: ‘#hash’
然后node里面提供了关于URL的几个方法
url.format(urlObj):
它的作用就是(根据官网API翻译了一下)
- href将被忽略。
- 路径将被忽略。
- 有或没有尾部:的协议处理方式相同:
- HTTP,HTTPS,FTP,Gopher处理成://(冒号斜线斜线)
- 所有其他协议的mailto,XMPP,aim,SFTP,FOO等将后缀为:
- 斜线设为true,如果该协议要求://(冒号斜线,斜线)
- 只需要对以前没有被列为需要斜线,如MongoDB的协议来进行设置://本地主机:8000 /,或者主机/主机名不存在。
- auth存在就使用。
- 如果主机不存在主机名才会使用。
- 如果主机不存在的端口才会被使用。
- 主机将代替主机名和端口的使用。
- 路径处理相同不管有或没有/(斜杠)。
- 查询如果搜索不存在才被使用。
- 搜索将代替查询中使用。
- 它被视为相同的有或没有的领先? (问号)。
- 哈希处理相同的带或不带龙头#(井号)。
ok差不多就是这么多,感觉是不是很繁琐,看不懂,所以试一下就知道咯
var http=require('http')var fs=require('fs')var url=require('url')var server=new http.Server()server.listen(8000)var url1="https://nodejs.org/dist/latest-v4.x/docs/api/url.html"var url2="https://nodejs.org:8080/dist/latest-v4.x/docs/api/url.html"var url3="nodejs.org:8080/dist/latest-v4.x/docs/api/url.html"console.log(url.format(url1)) //https://nodejs.org/dist/latest-v4.x/docs/api/url.htmlconsole.log(url.format(url2)) //https://nodejs.org:8080/dist/latest-v4.x/docs/api/url.htmlconsole.log(url.format(url3)) //nodejs.org:8080/dist/latest-v4.x/docs/api/url.html
所以我并不认为这个方法有何用,不过我建议先使用该方法把URL标准化,再用url.parse(),以避免出错。
url.parse(urlStr[, parseQueryString][, slashesDenoteHost])
var http=require('http')var fs=require('fs')var url=require('url')var server=new http.Server()server.listen(8000)var url1="https://nodejs.org/dist/latest-v4.x/docs/api/url.html"var url2="https://nodejs.org:8080/dist/latest-v4.x/docs/api/url.html"var url3="http://wowubuntu.com/markdown/#list"console.log(url.parse(url1))
还是上面的例子,废话就不多说了
非常有用
url.resolve(from, to)
该方法用于替换URL主机名后面的pathname
var http=require('http')var fs=require('fs')var url=require('url')var server=new http.Server()server.listen(8000)var url1="https://nodejs.org/dist/latest-v4.x/docs/api/url.html"console.log(url.resolve(url1,"/h"))//https://nodejs.org/hconsole.log(url.resolve(url1,"/resolve"))//https://nodejs.org/resolve
写到这里就算完了吧
下面还会继续写nodejs实现客户端,以及nodejs实现一个简单的网络爬虫,保持至少每日一篇博客更新的好习惯。
- nodejs实战之简单实现服务器端(顺便讲一下URL)
- 通过CGLIB实现AOP的浅析(顺便简单对比了一下JDK的动态代理)
- 通过CGLIB实现AOP的浅析(顺便简单对比了一下JDK的动态代理)
- 通过CGLIB实现AOP的浅析(顺便简单对比了一下JDK的动态代理)
- NodeJS之------(Url,QueryString,Path)模块
- nodejs API之URL
- nodeJs之URL模块
- nodejs之url模块
- 实战:Nodejs+Mongodb+Elasticsearch 实现简单的搜索
- nodejs实战express笔记之实现用户和文章页面
- 顺便说一下
- 实战开发:nodejs(express)+mongodb+........简单博客系统代码
- nodejs的API之URL
- SEO实战之:URL重写实现动态页面静态化
- PHP实战之实现简单的分页
- nodejs 路由(URL映射)
- nodejs 快速实现url图片重定向
- Nodejs 0.10.x 之Url模块
- Java如何集成支付宝即可到账接口
- 虚拟现实现实吗?
- error C2665: “AfxMessageBox”: 2 个重载中没有一个可以转换所有参数类型
- Nodejs的express使用教程
- Android美团多渠道打包方式
- nodejs实战之简单实现服务器端(顺便讲一下URL)
- CSS实现超出DIV宽度文字自动隐藏并显示省略号
- css中height:100%不起作用的解决方法
- 2016年2月至3月Android学习计划
- 又找到的一个POJ的分类,好多了这次
- Java 入门 之 静态函数与静态变量
- UI方面总结
- ConcurrentLinkedQueue Demo
- 理解 Android Build 系统