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实现一个简单的网络爬虫,保持至少每日一篇博客更新的好习惯。

0 0
原创粉丝点击