一、网络编程入门
1.1 软件结构
-
网络通信协议:通过计算机网络可以使多台计算机实现连接,位于同一个网络中的计算机在进行连接和通信时需要遵守一定的规则。在计算机网络中,这些连接和通信的规则被称为网络通信协议,它对数据的传输格式、传输速率、传输步骤等做了统一规定,通信双方必须同时遵守才能完成数据交换。
-
TCP/IP协议:
我们可以直接使用这些类和接口,来专注于网络程序开发,而不用考虑通信的细节。
由于使用UDP协议消耗资源小,通信效率高,所以通常都会用于音频、视频和普通数据的传输例如视频会议都使用UDP协议,因为这种情况即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响。
小贴士:
- 数据报(Datagram):网络传输的基本单位。
在TCP连接中必须要明确客户端与服务器端,由客户端向服务端发出连接请求,每次连接的创建都需要经过“三次握手”。
三次握手:TCP协议中,在发送数据的准备阶段,客户端与服务器之间的三次交互,以保证连接的可靠。
-
-
第一次握手,客户端向服务器端发出连接请求,等待服务器确认。
-
第二次握手,服务器端向客户端回送一个响应,通知客户端收到了连接请求。
-
-
1.4 网络编程三要素
1.4.1 协议
-
- IPv4:是一个32位的二进制数(4个字节)
- IPv6:
-
- 查看本机IP地址:ipconfig
- 检查网络是否连通:ping IP地址
JDK中提供了一个InetAdderss类,该类用于封装一个IP地址,并提供了一系列与IP地址相关的方法.
1.4.3 端口号
网络的通信,本质上是两个进程(应用程序)的通信。每台计算机都有很多的进程,如何在网络通信时,区分这些进程呢?
如果说IP地址可以唯一标识网络中的设备,那么端口号
1.5 资源分类
-
- 静态资源:所有用户访问后,得到的结果都是一样的,称为静态资源.静态资源可以直接被浏览器解析。如: html,css,JavaScript ...
- 动态资源:每个用户访问相同资源后,得到的结果可能不一样。称为动态资源。动态资源被访问后,需要先转换为静态资源,再返回给浏览器。如:servlet/jsp,php,asp ...
二、TCP通讯程序
2.1 概述
两端通信时步骤:
-
服务端程序,需要事先启动,等待客户端的连接。
-
客户端主动连接服务器端,连接成功才能通信。服务端不可以主动连接客户端。
-
在Java中,提供了两个类用于实现TCP通信程序:
-
客户端:
java.net.Socket
类表示。创建Socket
对象,向服务端发出请求,服务端响应请求,两者建立连接开始通信。 -
服务端:
java.net.ServerSocket
类表示。创建ServerSocket
对象,相当于开启一个服务,并等待客户端的连接。
-
2.2 Socket
类
该类实现客户端套接字,套接字指的是两台设备之间通讯的端点。
构造方法
-
-
public Socket(String host, int port)
:创建套接字对象并将其连接到指定主机上的指定端口号。如果指定的host是null ,则相当于指定地址为回送地址。 -
public Socket(InetAddress address, int port):创建套接字对象并将其连接到指定IP地址的指定端口号。
-
小贴士:回送地址(127.x.x.x) 是本机回送地址(Loopback Address),主要用于网络软件测试以及本地机进程间通信,无论什么程序,一旦使用回送地址发送数据,立即返回,不进行任何网络传输。
-
-
public InputStream getInputStream()
: 返回此套接字的输入流。-
如果此Scoket具有相关联的通道,则生成的InputStream 的所有操作也关联该通道。
-
关闭生成的InputStream也将关闭相关的Socket。
-
-
public OutputStream getOutputStream()
: 返回此套接字的输出流。-
如果此Scoket具有相关联的通道,则生成的OutputStream 的所有操作也关联该通道。
-
关闭生成的OutputStream也将关闭相关的Socket。
-
-
public void close()
:关闭此套接字。-
一旦一个socket被关闭,它不可再使用。
-
关闭此socket也将关闭相关的InputStream和OutputStream 。
-
-
public void shutdownOutput()
: 禁用此套接字的输出流。-
任何先前写出的数据将被发送,随后终止输出流。
-
-
这个类实现了服务器套接字,该对象等待通过网络的请求。
构造方法
-
-
public ServerSocket(int port)
:使用该构造方法在创建ServerSocket对象时,就可以将其绑定到一个指定的端口号上,参数port就是端口号。
-
-
-
public Socket accept()
:侦听并接受连接,返回一个新的Socket对象,用于和客户端实现通信。该方法会一直阻塞直到建立连接。 -
public InetAddress getInetAddress():返回此服务器套接字的本地地址。
-
三、UDP通讯协议
3.1 DatagramPacket
前面介绍了UDP是一种面向无连接的协议,因此,在通信时发送端和接收端不用建立连接。UDP通信的过程就像是货运公司在两个码头间发送货物一样。在码头发送和接收货物时都需要使用集装箱来装载货物,UDP通信也是一样,发送和接收的数据也需要使用“集装箱”进行打包,为此JDK中提供了一个DatagramPacket类,该类的实例对象就相当于一个集装箱,用于封装UDP通信中发送或者接收的数据。
想要创建一个DatagramPacket对象,首先需要了解一下它的构造方法。在创建发送端和接收端的DatagramPacket对象时,使用的构造方法有所不同,接收端的构造方法只需要接收一个字节数组来存放接收到的数据,而发送端的构造方法不但要接收存放了发送数据的字节数组,还需要指定发送端IP地址和端口号。
接下来根据API文档的内容,对DatagramPacket的构造方法进行逐一详细地讲解。
使用该构造方法在创建DatagramPacket对象时,指定了封装数据的字节数组和数据的大小,没有指定IP地址和端口号。很明显,这样的对象只能用于接收端,不能用于发送端。因为发送端一定要明确指出数据的目的地(ip地址和端口号),而接收端不需要明确知道数据的来源,只需要接收到数据即可。
使用该构造方法在创建DatagramPacket对象时,不仅指定了封装数据的字节数组和数据的大小,还指定了数据包的目标IP地址(addr)和端口号(port)。该对象通常用于发送端,因为在发送数据时必须指定接收端的IP地址和端口号,就好像发送货物的集装箱上面必须标明接收人的地址一样。
上面我们讲解了DatagramPacket的构造方法,接下来对DatagramPacket类中的常用方法进行详细地讲解,如下表所示。
3.2 DatagramSocket
DatagramPacket数据包的作用就如同是“集装箱”,可以将发送端或者接收端的数据封装起来。然而运输货物只有“集装箱”是不够的,还需要有码头。在程序中需要实现通信只有DatagramPacket数据包也同样不行,为此JDK中提供的一个DatagramSocket类。DatagramSocket类的作用就类似于码头,使用这个类的实例对象就可以发送和接收DatagramPacket数据包,发送数据的过程如下图所示。
在创建发送端和接收端的DatagramSocket对象时,使用的构造方法也有所不同,下面对DatagramSocket类中常用的构造方法进行讲解。
该构造方法用于创建发送端的DatagramSocket对象,在创建DatagramSocket对象时,并没有指定端口号,此时,系统会分配一个没有被其它网络程序所使用的端口号。
该构造方法既可用于创建接收端的DatagramSocket对象,又可以创建发送端的DatagramSocket对象,在创建接收端的DatagramSocket对象时,必须要指定一个端口号,这样就可以监听指定的端口。
上面我们讲解了DatagramSocket的构造方法,接下来对DatagramSocket类中的常用方法进行详细地讲解。
小贴士:
1.UDP中只有发送端和接收端,不区分客户端与服务器端,计算机之间可以任意地发送数据。
2.要实现UDP通信需要创建一个发送端程序和一个接收端程序,很明显,在通信时只有接收端程序先运行,才能避免因发送端发送的数据无法接收,而造成数据丢失。
四、HTTP(Hyper Text Transfer Protocol)超文本传输协议
4.1 概述
* 传输协议:定义了客户端和服务器端通信时,发送数据的格式
* 特点:
1. 基于TCP/IP的高级协议
2. 默认端口号:80
3. 基于请求/响应模型的:一次请求对应一次响应
4. 无状态的:每次请求之间相互独立,不能交互数据
* 历史版本:
* 1.0版本:每一次请求响应都会建立新的连接
* 1.1版本:复用连接
4.2 请求消息数据格式
1. 请求行
请求方式 请求url 请求协议/版本
GET url HTTP/1.1
* 请求方式:
* HTTP协议有7中请求方式,常用的有2种
* GET:
1. 请求参数在请求行中,在url后。
2. 请求的url长度有限制的
3. 不太安全
* POST:
1. 请求参数在请求体中
2. 请求的url长度没有限制的
3. 相对安全
2. 请求头:客户端浏览器告诉服务器一些信息
请求头名称: 请求头值
* 常见的请求头:
1. User-Agent:浏览器告诉服务器,我访问你使用的浏览器版本信息
* 可以在服务器端获取该头的信息,解决浏览器的兼容性问题
2. Referer:http://localhost/login.html
* 告诉服务器,我(当前请求)从哪里来?
* 作用:
1. 防盗链
2. 统计工作
3. 请求空行
* 空行,就是用于分割POST请求的请求头和请求体的。
4. 请求体(正文):
* 封装POST请求消息的请求参数的
4.3 响应消息数据格式
(... ...)