所有的联网的程序都需要进行网络通信,计算机中只有一个物理网卡,而且网卡的地址,同一个局域网中,网卡的地址是唯一的,网卡是通过唯一的IP地址来进行定位的,创造域名是因为好记。
定位了IP地址就能定位到服务器。服务器中有软件,比如qq软件,微信软件,浏览器软件,apache服务器软件
IP地址用来定位计算机,端口号用来定位具体的应用程序,所有需要联网通信的应用程序都会占用一个端口号
端口号的范围在0-65536之间,在计算机中有一些默认的端口号,最好不要去使用例如http的80
这里打印出发送请求的客户端的端口号和IP地址
server.on('request',function(req,res){
console.log('请求我的客户端的端口号是'+req.socket.remoteAddress,req.socket.remotePort)
//PS D:\100projects\nodepro> node .\07-http-url-res.js
//服务器已经启动了,可以访问了
请求我的客户端的端口号是::ffff:127.0.0.1 62694
可以同时开启多个服务,但是一定要确保不同服务占用的端口号不一致才可以。关于乱码问题,在服务端默认发送的数据,其实是UTF-8编码的内容,但是浏览器不知道你是UTF-8的编码的内容,会按照当前的操作系统的默认编码去解析,中文操作的系统默认是gbk,解决方法,正确的告诉浏览器我发送给你的编码是什么编码的,在http协议中,content-type就是用来告知对方我给你发送的数据内容是什么类型
res.setHeader('Content-Type','text/plain;charset = utf-8')
res.end('hello 世界')
res.end('<p>hello html<a href = "">点我</a></p>')
上面有个需要注意的地方就是,如果不写text/plain,浏览器会进行html渲染,如果加了text/plain则输出括号里面的字符串。发送html文件的时候要写text/html,即:
res.setHeader('Content-Type','text/html;charset = utf-8')
res.end('<p>hello html<a href = "">点我</a></p>')
渲染一个网页,并且不需要重新开启服务,直接修改对应资源的内容,用fs模块的readfile这里是一个引入html的例子
var http = require('http')
var fs = require('fs')
var server = http.createServer()
server.on('request',function(req,res){
var url = req.url
if (url==='/'){
// 肯定不这么干
// res.end('!Doc....太长了 也无法修改')
// 所以我们引入fs模块 把读取到的内容赋值给data
fs.readFile('./resource/index.html',function(err,data){
if (err){
res.setHeader('Content-Type','text/plain;charset=utf-8')
res.end('文件读取失败,请稍后重试')
}else {
//data默认是二进制数据,可以通过.toString转为咱们的字符串
// res.end()支持两种数据类型,一种是二进制一种是字符串
res.setHeader('Content-Type','text/html;charset=utf-8')
res.end(data.toString())
}
})
}
})
server.listen(3000,function(){
console.log('server is running')
})
这边的data默认是二进制数据,end()支持二进制数据,所以可以直接打印,并且由setheader规定html渲染,但是加了tostring好像也没有问题的,效果貌似就如同
res.end('<p>hello html<a href = "">点我</a></p>')
如果想读取图片成功,1.content-type改为’image/jpeg’,同时就不需要指定编码了
var http = require('http')
var fs = require('fs')
var server = http.createServer()
server.on('request',function(req,res){
var url = req.url
if (url==='/'){
// 肯定不这么干
// res.end('!Doc....太长了 也无法修改')
// 所以我们引入fs模块 把读取到的内容赋值给data
fs.readFile('./resource/index.html',function(err,data){
if (err){
res.setHeader('Content-Type','text/plain;charset=utf-8')
res.end('文件读取失败,请稍后重试')
}else {
//data默认是二进制数据,可以通过.toString转为咱们的字符串
// res.end()支持两种数据类型,一种是二进制一种是字符串
res.setHeader('Content-Type','text/html;charset=utf-8')
res.end(data.toString())
}
})
} else if(url==='/a'){
fs.readFile('./resource/kitty.jpg',function(err,data){
if (err){
res.setHeader('Content-Type','image/jpeg;charset=utf-8')
res.end('文件读取失败,请稍后重试')
}else {
//data默认是二进制数据,可以通过.toString转为咱们的字符串
// res.end()支持两种数据类型,一种是二进制一种是字符串
res.setHeader('Content-Type','image/jpeg')
res.end(data)
}
})
}
})
server.listen(3000,function(){
console.log('server is running')
})
完整代码。。
不知道为啥今天学到这里的时候vscode直接占了700M多内存,是不是插件太多还是我开的文件太多了。。
查询content-type的对应不同文件的解析,可以去网站
每天练习一个markdown语法~
今天是加粗~~粗粗粗粗 ctrl+B