----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------
网络模型:OSI参考模型,TCP/IP参考模型
物理层:定义物理设备标准,这一层的数据是比特bit
数据链路层:从物理层接受数据进行MAC地址(网卡的地址,固化在网卡上)的封装与解封装,数据帧,这一层的设备叫交换机,数据通过交换机来传输。可以分辨硬件,类似于人的DNA
网络层:从下层接受到的数据进行IP地址的封装与解封装,这一层的数据时数据包,工作的设备是路由器。路由器用来确定数据包的传输路径!IP地址用来标示主机,并给主机归类!类似于人的名字!IP和MAC的区别
传输层:定义了一些数据的协议和端口号
TCP(传输控制协议,传输效率低,可靠性强,用于传输可靠性要求高,数据量大的数据)
UDP(用户数据包协议,与TCP相反,用于传输可靠性要求不高,数据量小的数据)
会话层:通过传输层建立数据传输的通路
表示层:数据的爵士,加密解密,压缩解压——计算机能够识别到人能够识别
应用层:应用程序
网络嗅探:
数据的封包与拆包,知道数据的封装方法,就可以拆包!如果数据不加密,就会被破解!网络上没有隐私!
TCP/IP参考模型:
只有四层:应用层(协议超多,http等),传输层(传输协议),网际层(IP地址),主机至网络层
网络通讯要素:
IP地址:InetAddress
网络中的设备的标示
本地回环地址:设备访问自己的默认地址127.0.0.1
但是IP地址不便于记忆,可用主机名
www .sina .com .cn
万维网主机 主机名 商业 中国
news. sina. com. cn
新闻主机 主机名 商业 中国
端口号
用于标示进程的逻辑地址,不同进程的标示
就是标示应用程序的——逻辑端口
有效端口:0~65535,其中0~1024是系统使用或者保留端口
不指定端口无法与其他软件进行通讯
InetAdress类:
InetAddress ip=InetAdress.getLocalHost();
ip=InetAdress.getByName("www.sina.com.cn");
ip.getHostName();
ip.getHostAddress();
传输协议:规则
UDP:数据报文包协议,将数据及源和目的封装成数据包
不需要连接,对方在不在不重要,只需要将数据打
每一个数据报的大小限制在64K内
因无连接,是不可靠协议
——面向无连接,速度快
TCP:传输控制协议,必须要有传输数据的通信
建立连接,形成传输数据的通道
在连接中进行大数据船速
必须建立连接,效率太低
——面向连接
Socket:
(端点,套接口,插座:插网卡的插口)通信的两端都必须有Socket,低层还是IO技术!不同的是数据在网络之间传输!网络通讯就是Socket通讯,要进行网络通讯必须要有端点
UDP传输:
得有端点:在java.net包中查找UDP的端点,一般端点的名字都是以Socket结尾。
找到DatagramSocket对象——既可以发送也可以接受数据包的UDP端点对象
需求:创建一个UDP的发送端
思路:
1,创建一个UDP的Socket服务端点
2,明确要发送的数据
3,将数据装到数据包中,在数据包上明确具体的地址和端口
4,使用UDP的Socket将数据包发出
5,结束服务
需求:创建一个UDP的接收端
思路:
1,定义一个UDP的端点
2,使用UDP的服务端接受方法,将数据进行接收,并存储到数据包中,
之所以存储到数据包中,是因为为了使用数据包对象方法对收到的数据进行解析
3,获取数据包存储的有效数据
4,关闭
UDP是面向无连接的,所以两个程序谁先谁后并不要紧!只是结果可能不一样
这时候,如果先开启接收端,再开启发送端,并不一定能收到数据。因为接受端并没绑定端口,所以接收端必须先指定端口,这个端口必须是发送端发送时指定的端口。
——监听该接口
如果要接受多次,可以加上循环!
可以从键盘录入来获取并发送数据,循环中多次发送
无限循环中,有阻塞方法,可以存在,消耗并不大!阻塞之后,释放了执行权!
洪水攻击的原理:DDOS攻击,分布式攻击
不断发送数据到特定主机的IP的特定端口,主机无法处理,会死机;
hacker:肉鸡——分布式,
UDP分为发送端和接收端
TCP传输:
TCP分为客户端和服务端
需求:创建TCP客户端
1.需要创建TCP的客户端Socket服务,必须有端点
2.明确具体的地址和端口。明确目的地
3.TCP是面向连接,所以在传输任何数据之前必须确定连接已建立
一旦俩接确定就有了传输数据的通道
就可以让数据在通道内传输,这个通道就是流,是基于网络的流
——称为Socket流,这个流包含输入流和输出流
4,就可以获取socket中的输出流给目的地写入数据
5,关闭资源
需求:创建TCP服务端
1,必须有TCP服务端socket端点,而且要监听一个端口
2,获取连接过来的客户端,拿到Socket对象,从该对象获取输入流
3,通过该客户端的流和当前客户端进行通讯
4,关闭资源
???服务端跟客户端数据一来一回
常见客户端:浏览器,QQ
常见服务端:新浪(其实是访问了新浪的主机,主机中装有一个可以对外提供资源访问的软件,软件就是web服务器软件)
提供资源直接共享即可,但是不能实时更新!
这时可以用软件来实现对数据的更丰富的操作,操作的数据多的时候——数据库!
计算机化
提供网络数据的服务器——web服务器
最常见的web服务器软件tomcat,服务端必须监听端口
你能访问某一个软件,就是这个软件有类似ServerSocket的对象,然后分配了自己主机的一个端口,要访问就直接连接该端口
上网的时候,地址之后默认会加上80端口
做选择题的用户体验远高于填空题!那判断题呢?
演示:浏览器,Tomcat ---Apache 开源软件组织
http://127.0.0.1:8080代表本机8080端口,点进去之后会是该端口的默认页面
http://localhost:8080先走本地,本地的DNS配置中localhost对应的是127.0.0.1
也可以自己造域名,自己解析,然后就可以访问
html语言的标签直接被浏览器解析
servlet是在服务器端开发的程序片段
浏览器怎么能跟tomcat服务器完成通讯?tomcat的请求处理原理
演示:浏览器跟其他软件的通讯
通讯规范,浏览器跟服务器都遵守
浏览器到底做了什么事情?
浏览器最终会将请求的数据,发送给服务器
做个服务器,接受浏览器数据即可知道浏览器做了什么?
客户端:浏览器, 服务端:自定义服务器
浏览器和服务器虽属不同厂商,但都遵从相同标准。比如:在请求web资源时,使用的http协议。
浏览器发送的数据:用自定义服务端接收
http协议的请求消息:
请求行——
请求方式(7种剩2种get,post),请求资源路径 协议版本
GET /myweb/haha.html HTTP/1.1
请求消息头:键值对
Accept: */*(支持的文件格式)
Accept-Language: zh-cn(支持的语言)
Accept-Encoding: gzip, deflate(压缩和解压方式)
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C)
Host: 192.168.1.162:9090
Connection: Keep-Alive
这个空行,是规范中要求的,用来区分消息头和消息体的
//请求消息体.自己个性化信息
模拟一个浏览器:
自定义一个浏览器发送相同的内容
消息发送结束标记:一个空行,out.println();
服务端的应答消息:
应答行:协议 应答状态码 应答状态描述
HTTP/1.1 200 OK
应答消息头:键值对
缓存中的网页,浏览器把最后修改时间发给服务器,服务器判断最后修改时间跟当前网页的最后修改时间是否一致,如果一致,说明本地的网页是最新的,发送一个状态码给浏览器,浏览器就会打开缓存中的网页
//空行
应答消息体:
网页的内容
URL-统一资源定位符,用来访问资源,是指向互联网某一个资源的指针
URL对象在定位资源之后,可以连接资源
String url=new URL(str);
InputStream in =url.openStream();
byte[] buf=new byte[1024];
String str=new String(buf,0,in.read(buf));
System.out.println(str);//得到的是网页内容,没有应答信息
in.close();
再加上http内容解析引擎,就是浏览器了!webcat解析器开源的,IE解析器
url.openStream()就是下面这两句:
URLConnection conn=url.openConnection();
InputStream in=conn.getInputStream();
将传输层和应用层的协议,跟Socket进行了封装,对外提供了更简单的对象!
网络编程的重点在于低层原理!
http1.0和http1.1的区别:
http1.0是每一次请求都要先建立连接,没一次应答完之后关闭连接
http1.1是建立一次连接,之后可以有多次请求和应答
CS和BS结构:
CS:Client Server——客户端服务端————————Android的路线(Client)
特点:
1,客户端和服务端都需要程序员编写
2,维护起来较麻烦
3,可以分离一部分运算到客户端。比如杀毒
网游:
BS:Browser Server——浏览器服务端————————javaEE的路线
特点:————更方便,应用面更广
1,程序员只需要开发服务端,客户端只需要使用浏览器即可
2,只需要维护服务端即可
3,所有的运算都在服务端
正则表达式:————专门针对于字符串进行处理的规则
String regex="[1-9][0-9]{4,14}";
——一段字符串不能0开头,只能有数字,位数在5-15位
boolean matches(String regex)字符串是否符合给定的正则表达式
不用正则的时候,判断只能是数字:
try{
Long.parseLong(str);
}catch(NumberFormatException){}
原来正则规则就是一些符号的组合
哲学性符号具备着特定的含义,同时代表着具体的代码
书写起来比写代码要简化的多;但是符号多了阅读性差。
正则对于字符串的操作:匹配,切割,替换,获取
1,匹配:String之中的matches方法
2,切割:split方法
正则中的复用(*),用小括号封装,会自动给小括号编号,称为组
先用()来定义正则组,用数字编号来获取该组,先有组,再通过标号获取,编号需要转义
用叠词切割:"(.)\\1+"
组嵌套:((A)(B(C)))
包含4个组:((A)(B(C))),(A),(B(C)),(C)
3,替换:replaceAll(regex,""),replaceFirst(regex,"")方法
$的作用:可以在后一个参数中取前一个正则参数组
//把叠词用单字符代替
str=str.replaceAll("(.)\\1+","$1");
//把多个数字用4个*代替,取消联系方式
str=str.replaceAll("\\d{5,}","****");
//把电话号码中间四位用4个*隐藏
str=str.rA("(1\\d{2})\\d{4}(\\d{4})","$1****$2");
4,获取:获取符合规则的数据
使用到了Pattern对象。
//1,将具体的正则表达式字符串编译成Pattern对象
Pattern p = Pattern.compile("a*b");
//2,获取匹配器
Matcher m = p.matcher("aaaaab");
//3,使用matcher方法
boolean b = m.matches();——匹配
获取:
Pattern p=Pattern.compile(reg);
Matcher m=p.matcher(str);
while(m.find()){//只负责找
System.out.println(m.group());//只负责取
}
校验邮箱地址,网络爬虫找特定信息(邮箱地址)