首先我们要简单理解一下应用层和传输层。在这片文章里面姑且可以把http看做是应用层的东西,TCP/IP看做是传输层的东西,传输层的东西负责传输数据,应用层的东西负责显示数据。
下面开始我们的代码
首先写一个服务器端
//sever.js
var net = require("net")
var server = net.createServer()
server.listen(12306, "127.0.0.1")
server.on("listening", function () {
console.log("server is run ")
})
server.on("connection", function(socket){
console.log("new net come")
socket.on("data", function (data) {
console.log(data.toString())
})
})
当我们运行这段代码,并在浏览器url上面写上ip地址+端口(即 http://localhost:12306 ) 的时候,可以看到控制台有这么一段输出:
很明显,这就是我们前端开发过程中经常打交道的http请求。
为什么data.toString()就可以看到http请求?带着这个问题,我们回忆起在浏览器地址栏输入url之后…经典面试题(详情看我的另一篇博客)
回忆杀结束后,其实可以简单概括成一句话:http是应用层上面的东西,而我们的tcp/ip是传输层上面的东西,我们在传输层(server层)就获取到了应用层的http协议。
拿到http协议之后,我们能做些什么?看第一行 “GET / HTTP/1.1”是不是很眼熟?如果我们把url改一下呢,写成http://localhost:12306/index.html
带着疑问进行了以下测试,于是结果如下:
可见 GET后面的 /index.html就是我们在url上面写的东西。
知道了这个我们能做些什么?能不能做个根据访问的页面来实现数据查询或是页面查询?可以的,不过这个问题在下一篇文章会进行详细说明,这里咱先不急。
话说回头,浏览器给我们发了个http,我们总不能啥都不做吧。如果我们也得给它回个信息怎么做?看到这里你可能会有个大胆的想法,用socket.write(“返回给浏览器一个数据”)
带着这个大胆的想法,我们决定实践一下:
var net = require("net")
var server = net.createServer()
server.listen(12306, "127.0.0.1")
server.on("listening", function () {
console.log("server is run ")
})
server.on("connection", function(socket){
console.log("new net come")
socket.on("data", function (data) {
console.log(data.toString())
socket.write("返回给浏览器一个数据")
})
})
结果报了个错:
这是为什么?难道用write不对吗??
不是的,用write没错,但是你传给浏览器的也必须是个http协议啊
这么说吧,浏览器发过来的http是请求头,那么你返回去的就必须是个响应头。如果不是响应头,就失败。意思是谁知道你会传过去什么鬼东西,不收不收。
修改后代码如下:
var net = require("net")
var server = net.createServer()
server.listen(12306, "127.0.0.1")
server.on("listening", function () {
console.log("server is run ")
})
server.on("connection", function(socket){
console.log("new net come")
socket.on("data", function (data) {
console.log(data.toString())
socket.write("HTTP 200OK\r\nContent-type:text/html\r\n\r\n<html><body>HELLO WORLD!</body></html>")
})
})
结果如图:
简单说一下,响应头长这个样子:
HTTP 200OK
Content-type:text/html
<html><body>HELLO WORLD!</body></html>
\r\n是传义字符,表示空格 换行
可见,http协议传过去了。由此,我们明白了后端是怎么给前端传值的。
最后,我们将代码优化一下,分割获取出访问的页面是啥
var net = require("net")
var server = net.createServer()
server.listen(12306, "127.0.0.1")
server.on("listening", function () {
console.log("server is run ")
})
server.on("connection", function(socket){
console.log("new net come")
socket.on("data", function (data) {
var requst = data.toString().split("\r\n")
var url = requst[0].split(" ")[1]
console.log(url)
socket.write("HTTP 200OK\r\nContent-type:text/html\r\n\r\n<html><body>HELLO WORLD!</body></html>")
})
})