网络编程
什么是web服务器
- web服务器是一种应用服务器
2.3node 没有web容器
- 就是web服务器的意思
3.4ip&端口号
- ip
- 唯一标识一台上网的设备
- 端口
- 唯一标识设备上的一个应用程序
- 地址
- localhost:3000 不走网卡
- 127.0.0.1:3000 走网卡
- 192.168.141.xxx 通过网卡发送请求给路由或交换机,在请求回来你的电脑
-
怎么通过域名找到你的电脑
- get没有请求体,post有请求体???
- 由于get方式是不包含实体内容的,实体内容就(也就是表单的数据)以参数的形式在url地址后面出现
- post是包含实体内容的,它把表单数据放入实体内容里面,以’实体内容’的形式传输
2.6 http协议
- 概念
http模块
使用http模块进行web开发
- 01-server.js
- 引入http模块
- 创建一个http服务器的实例
- 要让服务器接收http请求
- 回调函数里面有两个参数
- request对象的作用
- 存储浏览器发送过来的http请求的内容
- response对象
- 封装一个返回的报文
- 一旦执行额end方法,响应报文就返回了,整个http请求到相应的流程就结束了
- server.listen(3000)设置端口号
- node默认用3000端口号
- 192.168.24.103
- chrome中,更多工具–>编码–>设置成utf-8
- 代码 ```
- 设置
- 请求
- 请求头、方法、路径、请求http协议版本
### response ###
- 方法
- res.write('')
- write 一直向报文体里写,也就会传给浏览器
- res.end(参数)
- end执行了表示报文已经返回了
- 参数
- 可以写,就是先自己有write一下+end()
- 不写,就是直接进行end()
- response.writeHead(200,{'Content-Type':'text/html;charset=utf-8'})
- 'Content-Type':'text/html;' 解析成html格式的
- 告诉浏览器,你用html格式去解析
- 在index.html中的script
- 图片 脚本 css 等都发送http请求
- 去执行了127.0.1:3000/main.js
- 发送请求
- 发送html,就只
- 验证 req.url
- 页面中的资源,会发送http请求去请求一遍
- 请求路径有同源路径
- 不写前面的根路径,自己会默认的去找
- 上面的都是http的get请求
- http模块是核心模块
1/14/2017 11:40:10 AM
- 补充
- res.end()之后的代码
- end方法后面不可以在对响应报文做出操作,
- 但是可以继续执行后面的跟操作报文无关的代码
- res.writeHead()必须放在write
- 如果需要设置响应头,需要优先于响应体设置
- 如果已经设置了响应体以后,不能再设置响应头
- 因为已经发送给用户了
- 先 响应头再响应体的 (根据http的请求报文为依据)
## ajax ##
### ###
1. 05.ajax
### post ###
- post在后台接数据
- 通过request对象的data事件,可以一块一块的获取到浏览器发送http报文的报文体
- 之前的是设置请求头,将请求头给request的了,我们不需要关系
- data事件什么时候触发
- 每发送一小块数据data事件就会触发
- req.on('end',function(){数据接收完成触发的事件})
### node.js之Url & QueryString模块 ###
#### URL模块 ####
- 将字符串转换成对象
- 参考文档
- http://www.jianshu.com/p/aed6a885db61
- 代码
var url = require("url");
var qs = require("querystring");
var urlStr = "http://127.0.0.1:3000/getData?name=waxun&age=11";
// console.log(url.parse(urlStr));
//将字符串转换成对象
console.log(url.parse(urlStr).pathname);
console.log(url.parse(urlStr).query);//name=waxun&age=11
console.log(qs.parse(url.parse(urlStr).query));
#### queryString 模块 ####
- 查询字符串主要由两个方法和内置格式化方法组成,
- 一个是将对象转换为字符串,
- 一个则是相反,将字符串转换为对象
- querystring.stringify(obj, [sep], [eq])
- 将对象转换成json字符串
- 将JSON对象格式化为查询字符串格式的字符串,默认的分隔符为:“&”和“=”
- querystring.parse(str, [sep], [eq], [options]):
- 将json字符串转换json对象
- 根据“&”和“=”将字符串进行分割,反序列化为JSON对象
- 代码
//将对象转换成json字符串
//querystring.stringify(obj, [sep], [eq]);
/*var qs = require("querystring");
var obj = {
"name" : "waxun",
"age" : 11
};
// qs.stringify(obj);
console.log(qs.stringify(obj));//name=waxun&age=11
console.log(typeof qs.stringify(obj));//string*/
//将json字符串转换json对象
var qs = require("querystring");
var str = "name=waxun&age=11";
console.log(qs.parse(str));//{ "name" : "waxun","age" : 11}
console.log(qs.parse(str).name);//waxun
console.log(typeof qs.parse(str));
# 2. 同步与异步 #
### 2.1 什么是i/o? ###
i/O 在服务器上可以理解为读写操作
### 2.2 什么是并发 ###
- 一个时间段中有几个程序都处于已情动运行到运行完毕之间
# 3.异步i/o与实践驱动 #
### 3.1什么是进程 ###
- 进程是为运行当中的应用程序提供运行环境的
- 一个运行当中的应用程序就会有一个进程与之相对应
- 进行执行应用程序
### 线程 ###
- 线程是用来运行应用程序中代码的
- 一个线程在一个时间只能做一件事件
- 多线程,调用起来很麻烦
- node是单线程执行,用异步替代了多线程
- 多线程的有调度关系
### 3.3同步、异步有什么不同 ###
- 同步是按顺序执行、会阻塞后面代码的执行
- 异步时不需要等前面的代码再慢,也不会阻塞后面代码的执行
- 异步总是有callback就是这个原因
### 同步异步例子 ###
- 同步代码阻塞后面代码的执行
- 异步代码
- 写一个setTimeout(function(){},1)
- 先执行的永远是同步代码
- 异步代码
- 是不一定的顺序
- 异步函数谁先调用callback函数是不一定的
### 问题 ###
- 没设置成dataType类型
- 数据在传输的过程中是json字符串的形式,
- 那为什么有的可以进行返回json对象的形式?
- 这个是怎么过来的数据
- res.writeHead(200,{"Content-Type":"text/json;charset=utf-8"});
1/14/2017 10:09:27 PM
- 前台进行发送ajax请求,后台进行接收数据进行返回数据
- 代码
ajax.js
var http = require("http");
var fs = require("fs");
var server = http.createServer();
server.on("request", function (req, res) {
if (req.url == "/" && req.method == "GET") {
fs.readFile("./index.html", function (err, data) {
if (err) {
console.log(err);
}
res.write(data);
res.end();
})
} else if (req.url == "/jquery.min.js" && req.method == "GET") {
fs.readFile("./jquery.min.js", function (err, data) {
if (err) {
console.log(err);
}
res.write(data);
res.end();
})
} else if (req.url == "/getData" && req.method == "POST") {
//GET请求
/*var dataJson = {
"name" : 123,
"age" : 18
};
res.end(JSON.stringify(dataJson));*/
//POST请求
var info = "";
//监听数据
req.on("data", function (str) {
info += str;
})
//监听数据接收完成事件
req.on("end", function () {
console.log(info);
//后端返回一个成功的提示信息,以字符串的形式进行返回
var data = { "success": "true" };
res.end(JSON.stringify(data));
})
}
})
server.listen(3000);
- 前台代码
```
http协议&node.js之Url&QueryString模块
反馈
- 反馈一
- 要规避本地和原生模块的同名
- 反馈二
- myRequire是module的经典案例
- 上天内容
- require 和 module 和 module.exports
- require
- 参数
- 字符串
- 路径、名称(核心模块/包)
- 可以省略后缀.js .node .json
- 第一次加载读源文件,第二次加载缓存
- module.exports
- 当前node_modules去找,一级一级向上找
- 字符串
- 参数
- module
- 当一个js一执行,就产生了一个module..
- module.exports是一个空对象
- exports是module.exports的别名
- module.exports里面只能加属性,以免覆盖
- npm命令
- 命令多练习
-
全局环境中path里面对应的node_modules是干嘛的?
- http://www.tuicool.com/articles/RZ3mAn7