黑马程序员:网络编程

来源:互联网 发布:重庆高端seo外包公司 编辑:程序博客网 时间:2024/06/06 01:46

----------- 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,创建一个UDPSocket服务端点

2,明确要发送的数据

3,将数据装到数据包中,在数据包上明确具体的地址和端口

4,使用UDPSocket将数据包发出

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.18080代表本机8080端口,点进去之后会是该端口的默认页面

http://localhost:8080先走本地,本地的DNS配置中localhost对应的是127.0.0.1

也可以自己造域名,自己解析,然后就可以访问

html语言的标签直接被浏览器解析

servlet是在服务器端开发的程序片段

浏览器怎么能跟tomcat服务器完成通讯?tomcat的请求处理原理

演示:浏览器跟其他软件的通讯

通讯规范,浏览器跟服务器都遵守

浏览器到底做了什么事情?

浏览器最终会将请求的数据,发送给服务器

做个服务器,接受浏览器数据即可知道浏览器做了什么?

客户端:浏览器,  服务端:自定义服务器

浏览器和服务器虽属不同厂商,但都遵从相同标准。比如:在请求web资源时,使用的http协议。

浏览器发送的数据:用自定义服务端接收

http协议的请求消息:

请求行——

请求方式(7种剩2getpost),请求资源路径  协议版本

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());//只负责取

}

校验邮箱地址,网络爬虫找特定信息(邮箱地址)

反射——底层框架都用


----------- android培训java培训、java学习型技术博客、期待与您交流! ------------