黑马程序员--Java--网络编程
2015-07-29 13:23
411 查看
------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------
OSI(open System Interconnection 开放系统互联)参考模型
TCP/IP参考模型
OSI参考模型
TCP/IP参考模型
应用层 ------------
表示层 应用层
会话层 ------------
传输层 传输层
网络层 网络层
数据链路层 ------------
物理成 主机至网络层
七层的描述:
1.物理层:主要定义物理设备标准:如网线的接口、光纤的接口类型等,它主要作用是传输比特流(就是1、0转化成电流的强弱来进行传输,到达目的地后在转化成1、0的数据),这一层的数据叫比特。
2.数据链路层:主要讲从物理层的数据进行MAC地址(网卡的地址)的封装和解封。
3.网络层:主要将下层接收到的数据进行IP地址的封装和解封。
4.传输层:定义一些数据的协议和端口:如TCP(传输控制协议,传输效率较低,可靠性强,用于传输可靠性要求高,数据量大的数据),UDP(用户数据协议,与TCP特性恰好相反,用于传输可靠性要求低,数据量小的数据,例如QQ聊天)。
5.会话层:通过传输层建立数据传输的通道。主要在你的系统间发起会话或者接收绘画请求。
6.表示层:主要进行对接收数据进行解释,加密与解密、压缩与解压。
7.应用层:主要是一些终端的应用,如ptf、IE等
ps:
1.每个网卡的地址都是全球唯一的。
2.路由器实现将数据包发送到指定的地点
3.应用软件之间的通讯过程就是层与层之间封包、解封的过程。
4.OIS设计模型过于精细,后简化为TCP/IP参考模型。
1.2 网络通讯的要素
1.IP地址:InetAddress
网络中设备的标识;不易记忆,可用主机名。
本地回环地址:127.0.0.1 主机名:localhost
此类为构造方法,只能通过特定的静态方法获取地址:
InetAddress ia = InetAddress.getByName("192.168.0.1");
InetAddress[] ia = InetAddress.getByName("www.baidu.com");//应为百度的主机不止一台,得到的是一个地址数组。
得到地址对象后,可用其中的方法得到地址的信息:
ia.getHostName();
ia.getHostAddress();
ps:
1.IPV4数量已经不够用了,因此产生了IPV6。
2.在没有连接网络的情况下,为了能访问本机,所有分配了一个默认IP地址,就是本地回环地址。
3.通过ping 127.0.0.1 可用测试网络是不是通,如果不同,网卡出现问题。
4.每一台计算机都有自己的计算机名。
2.域名解析
例:在在浏览器中输入新浪的域名(www.sina.com.cn),DNS解析域名成IP,然后计算机再通过获得打牌的IP访问新浪的服务器。
但是域名解析最先查看的是本地hosts(C:\WINDOWS\system32\drivers\etc\hosts)文件,解析失败了才去访问DNS服务器解析,获取IP地址。
可以在hosts文件中自定义垃圾网站的地址为本机地址,当访问到垃圾网站了,就不会访问它的地址,而是访问本机地址。
3.端口号
用于标识进程(应用程序)的逻辑地址,不同进程的标识。
有效端口:0-65535 其中 0-1024 系统使用或者保留端口。
4.传输协议
常见协议:TCP、UDP
UDP
1、将数据及
b1cf
源和目的封装成数据包中, 不需要建立连接。
2、每个数据报的大小在限制在64k内。
3、因无连接, 是不可靠协议。
4、不需要建立连接, 速度快。
应用案例: QQ、 FeiQ聊天、 在线视频用的都是UDP传输协议。
TCP
1、建立连接, 形成传输数据的通道。
2、在连接中进行大数据量传输。
3、通过三次握手完成连接, 是可靠协议。
4、必须建立连接, 效率会稍低。
应用案例: FTP, File Transfer Protocol( 文件传输协议) 。
1.3 UDP协议 发送端与接收端
发送端:
1、建立Socket服务。
2、提供数据,并将数据封装成数据包。
3、通过Socket服务的send方法,将数据发送出去
4、关闭资源
接收端:
1、建立Socket服务,监听一个端口。
2、定义一个数据包,定义一个字节数组,用于存储接收到的信息。
3、通过Socket的receive方法将收到的数据存入已定好的数据包中。
4、通过数据包中的方法将数据取出。
5、关闭资源。
示例代码:
ps:由于UDP协议,只管数据的发送,不保证是否能接收到数据,因此,首先要先启动接收端,在启动发送端,不然接收不到数据。
1.4 TCP协议 客户端和服务端
客户端:当创建了Socket,给定主机后,就创建了输入读取流。
1、创建Socket对象。需要明确连接的主机和端口
2、通过getOutputStream()从Socket中获得输入流,调用流的write方法即可向服务端写数据了。
3、通过getInputStrream()从Socket中获得读取流,调用流的read方法读取服务端返回的数据。
4、关闭资源。
服务端:服务端对应多个客户端,与客户端的数据传输用到的是客户端的流。
1、创建ServerSocket对象。需要明确连接的端口
2、调用ServerSocket中的accept方法获得对应的客户端对象,
3、调用客户端Socket的getInputStream方法读取客户端发送的数据,调用getOutputStream方法给客户端发送数据。
4、关闭资源。需要关闭服务端和客户端。
ps:TCP协议需要先开服务端,再开客户端。
练习代码:TCP协议上传文本文件:
1.5 了解客户端
自定义服务端:
运行结果:
GET / HTTP/1.1
Host: 127.0.0.1:10010
Connection: keep-alive
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0
.8
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like
Gecko) Chrome/35.0.1916.153 Safari/537.36 SE 2.X MetaSr 1.0
Accept-Encoding: gzip,deflate,sdch
Accept-Language: zh-CN,zh;q=0.8
发送的是请求消息头.
相应的当服务端也为浏览器时,会给客户端包括:应答消息头和消息主体。
1.6 URL和URLconnection
URI:统一资源标示符。
URL:统一资源定位符,也就是说可以根据URL定位网络上的某个资源,他是指向互联网资源的指针。
每个URL都是URI,但不是每个URI都是URL。应为URI还包括一个字类URN(统一资源名称),他命名资源但不指定如何定位资源。
示例:
String str = "http://192.168.1.100:8080/myweb/1.html?name=lisi";
URL u = new URL(str);
就可有通过URL中的方法获得对应主机端口中的信息。
u.getProtocol():协议
u.getHost(): 主机地址
u.getPort():端口
u.getFile():文件路径和文件信息
u.getPath():目录路径
u.getQuery():键值对参数信息
最重要的:
URLConnection c = u.openConnection():把消息的主体按消息头解析后封装成了对象。
网络编程
1.1 网络参考模型OSI(open System Interconnection 开放系统互联)参考模型
TCP/IP参考模型
OSI参考模型
TCP/IP参考模型
应用层 ------------
表示层 应用层
会话层 ------------
传输层 传输层
网络层 网络层
数据链路层 ------------
物理成 主机至网络层
七层的描述:
1.物理层:主要定义物理设备标准:如网线的接口、光纤的接口类型等,它主要作用是传输比特流(就是1、0转化成电流的强弱来进行传输,到达目的地后在转化成1、0的数据),这一层的数据叫比特。
2.数据链路层:主要讲从物理层的数据进行MAC地址(网卡的地址)的封装和解封。
3.网络层:主要将下层接收到的数据进行IP地址的封装和解封。
4.传输层:定义一些数据的协议和端口:如TCP(传输控制协议,传输效率较低,可靠性强,用于传输可靠性要求高,数据量大的数据),UDP(用户数据协议,与TCP特性恰好相反,用于传输可靠性要求低,数据量小的数据,例如QQ聊天)。
5.会话层:通过传输层建立数据传输的通道。主要在你的系统间发起会话或者接收绘画请求。
6.表示层:主要进行对接收数据进行解释,加密与解密、压缩与解压。
7.应用层:主要是一些终端的应用,如ptf、IE等
ps:
1.每个网卡的地址都是全球唯一的。
2.路由器实现将数据包发送到指定的地点
3.应用软件之间的通讯过程就是层与层之间封包、解封的过程。
4.OIS设计模型过于精细,后简化为TCP/IP参考模型。
1.2 网络通讯的要素
1.IP地址:InetAddress
网络中设备的标识;不易记忆,可用主机名。
本地回环地址:127.0.0.1 主机名:localhost
此类为构造方法,只能通过特定的静态方法获取地址:
InetAddress ia = InetAddress.getByName("192.168.0.1");
InetAddress[] ia = InetAddress.getByName("www.baidu.com");//应为百度的主机不止一台,得到的是一个地址数组。
得到地址对象后,可用其中的方法得到地址的信息:
ia.getHostName();
ia.getHostAddress();
ps:
1.IPV4数量已经不够用了,因此产生了IPV6。
2.在没有连接网络的情况下,为了能访问本机,所有分配了一个默认IP地址,就是本地回环地址。
3.通过ping 127.0.0.1 可用测试网络是不是通,如果不同,网卡出现问题。
4.每一台计算机都有自己的计算机名。
2.域名解析
例:在在浏览器中输入新浪的域名(www.sina.com.cn),DNS解析域名成IP,然后计算机再通过获得打牌的IP访问新浪的服务器。
但是域名解析最先查看的是本地hosts(C:\WINDOWS\system32\drivers\etc\hosts)文件,解析失败了才去访问DNS服务器解析,获取IP地址。
可以在hosts文件中自定义垃圾网站的地址为本机地址,当访问到垃圾网站了,就不会访问它的地址,而是访问本机地址。
3.端口号
用于标识进程(应用程序)的逻辑地址,不同进程的标识。
有效端口:0-65535 其中 0-1024 系统使用或者保留端口。
4.传输协议
常见协议:TCP、UDP
UDP
1、将数据及
b1cf
源和目的封装成数据包中, 不需要建立连接。
2、每个数据报的大小在限制在64k内。
3、因无连接, 是不可靠协议。
4、不需要建立连接, 速度快。
应用案例: QQ、 FeiQ聊天、 在线视频用的都是UDP传输协议。
TCP
1、建立连接, 形成传输数据的通道。
2、在连接中进行大数据量传输。
3、通过三次握手完成连接, 是可靠协议。
4、必须建立连接, 效率会稍低。
应用案例: FTP, File Transfer Protocol( 文件传输协议) 。
1.3 UDP协议 发送端与接收端
发送端:
1、建立Socket服务。
2、提供数据,并将数据封装成数据包。
3、通过Socket服务的send方法,将数据发送出去
4、关闭资源
接收端:
1、建立Socket服务,监听一个端口。
2、定义一个数据包,定义一个字节数组,用于存储接收到的信息。
3、通过Socket的receive方法将收到的数据存入已定好的数据包中。
4、通过数据包中的方法将数据取出。
5、关闭资源。
示例代码:
import java.net.*; class SendSocket { public static void main(String[] args) throws Exception { DatagramSocket ds = new DatagramSocket(8888); byte[] buf = new String("传出数据").getBytes();//为传出的数据,可是和键盘输入流结合。 DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("127.0.0.1"),10010); ds.send(dp); ds.close(); } } class ReceiveSocket { public static void main(String[] args) throws Exception { DatagramSocket ds = new DatagramSocket(10010); byte[] buf = new byte[1024]; DatagramPacket dp = new DatagramPacket(buf,buf.length); ds.receive(dp);//为阻塞式方法,即需要先运行,等待数据发送。 String name = dp.getAddress().getHostName(); String data = new String(dp.getData(),0,dp.getLength()); int port = dp.getPort(); System.out.println("port:"+port+" name:"+name+" data:"+data); ds.close(); } }
ps:由于UDP协议,只管数据的发送,不保证是否能接收到数据,因此,首先要先启动接收端,在启动发送端,不然接收不到数据。
1.4 TCP协议 客户端和服务端
客户端:当创建了Socket,给定主机后,就创建了输入读取流。
1、创建Socket对象。需要明确连接的主机和端口
2、通过getOutputStream()从Socket中获得输入流,调用流的write方法即可向服务端写数据了。
3、通过getInputStrream()从Socket中获得读取流,调用流的read方法读取服务端返回的数据。
4、关闭资源。
服务端:服务端对应多个客户端,与客户端的数据传输用到的是客户端的流。
1、创建ServerSocket对象。需要明确连接的端口
2、调用ServerSocket中的accept方法获得对应的客户端对象,
3、调用客户端Socket的getInputStream方法读取客户端发送的数据,调用getOutputStream方法给客户端发送数据。
4、关闭资源。需要关闭服务端和客户端。
ps:TCP协议需要先开服务端,再开客户端。
练习代码:TCP协议上传文本文件:
import java.net.*; import java.io.*; class Client { public static void main(String[] args) throws UnknownHostException,IOException { Socket s = new Socket("127.0.0.1",10012); BufferedReader bufr = new BufferedReader(new FileReader("a.txt")); PrintWriter out = new PrintWriter(s.getOutputStream(),true); String line ; while((line = bufr.readLine())!=null){ out.println(line); } s.shutdownOutput();//加入结束标记,以确定向服务端传送数据动作结束。 BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream())); System.out.println(in.readLine()); s.close(); bufr.close(); } } class Server { public static void main(String[] args) throws IOException { ServerSocket ss = new ServerSocket(10012); Socket s = ss.accept(); BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream())); BufferedWriter bufw = new BufferedWriter(new FileWriter("b.txt")); String line; while((line=in.readLine())!=null){ bufw.write(line); bufw.newLine(); } PrintWriter out = new PrintWriter(s.getOutputStream(),true); out.println("已收到数据,上传成功");//print()方法不会自动刷新出缓冲区。 s.close(); bufw.close(); ss.close(); } }
1.5 了解客户端
自定义服务端:
class MyServer{ public static void main(String[] args) throws IOException{ ServerSocket ss = new ServerSocket(10010); Socket s = ss.accept(); InputStream in = s.getInputStream(); byte[] buf = new byte[1024]; int len = in.read(buf); System.out.println(new String(buf,0,len)); PrintWriter out = new PrintWriter(s.getOutputStream(),true); out.println("<font color='red' size='7'>欢迎光临</font>"); s.close(); ss.close(); } }
运行结果:
GET / HTTP/1.1
Host: 127.0.0.1:10010
Connection: keep-alive
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0
.8
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like
Gecko) Chrome/35.0.1916.153 Safari/537.36 SE 2.X MetaSr 1.0
Accept-Encoding: gzip,deflate,sdch
Accept-Language: zh-CN,zh;q=0.8
发送的是请求消息头.
相应的当服务端也为浏览器时,会给客户端包括:应答消息头和消息主体。
1.6 URL和URLconnection
URI:统一资源标示符。
URL:统一资源定位符,也就是说可以根据URL定位网络上的某个资源,他是指向互联网资源的指针。
每个URL都是URI,但不是每个URI都是URL。应为URI还包括一个字类URN(统一资源名称),他命名资源但不指定如何定位资源。
示例:
String str = "http://192.168.1.100:8080/myweb/1.html?name=lisi";
URL u = new URL(str);
就可有通过URL中的方法获得对应主机端口中的信息。
u.getProtocol():协议
u.getHost(): 主机地址
u.getPort():端口
u.getFile():文件路径和文件信息
u.getPath():目录路径
u.getQuery():键值对参数信息
最重要的:
URLConnection c = u.openConnection():把消息的主体按消息头解析后封装成了对象。
相关文章推荐
- 深度学习 caffe 建自己的数据库 训练一个自创卷积神经网络 过程总结
- 实现简单HTTP服务器-图片与CGI
- 求.net后台程序员 http://jwstudio.cn?s=9uH (麻烦帮忙,广而告之,谢谢)
- poj 1273 裸 网络流 (dinic)
- HTTP Header
- linux中配置桥接网络,让虚拟机能够上网
- linux中配置桥接网络,让虚拟机能够上网
- http常见状态码详解
- 解决burp suite 使用chrome访问https失真的问题
- 关于多网络时钟的讨论
- 何谓同源策略以及解决同源策略的方法(ajax方法和http的方法)
- AngularJS如何跨域发起Http请求(Access-Control-Allow-Origin)
- 黑马程序员--网络编程
- curl 模拟http发送请求
- IOCP模型与网络编程
- Android-async-http 例子
- 玩转Android---UI篇---WebView(网络视图)
- 【HttpClient4.5中文教程】译者的话,目录,序言
- nginx tcp proxy <备忘>
- AFNetworking、MKNetworkKit和ASIHTTPRequest对比