一、网络架构模型
1、OSI参考模型
OSI定义了网络连接的七层框架(物理层、数据链路层、网络层、传输层、会话层、表示层、应用层)
2、TCP/IP五层模型
TCP/IP 五层协议(物理层、数据链路层、网络层、传输层、应用层)
(1)应用层:主要负责应用程序的协议,例如HTTP协议、FTP协议等。
(2)传输层:主要使网络程序进行通信,在进行网络通信时,可以采用TCP协议,也可以采用UDP协议。
(3)网络层:网络层是整个TCP/IP协议的核心,它主要用于将传输的数据进行分组,将分组数据发送到目标计算机或者网络。
(4)数据链路层:链路层是用于定义物理传输通道,通常是对某些网络连接设备的驱动协议,例如针对光纤、网线提供的驱动。
二、协议分类
java.net包中提供了两种常见的网络协议的支持:TCP和UDP。
1、TCP
(1)TCP:是一种面向连接的保证可靠传输的协议,通过TCP协议传输,得到一个顺序无差错的数据流,发送方和接收方成对的两个socket之间必须连接连接,当一个socket 等待连接时,另一个 socket可以要求进行连接,一旦两个socket连接起来,它们就可以进行双向的数据传输,双方都可以进行发送和接收。
(2)TCP的三次握手
第一次:客户端发送SYN包到 服务器,并进入SYN_SEND状态,等待服务器确认。
第二次:服务器接收到SYN包,必须确认客户端的SYN,同时自己也发送一个SYN包,此时服务器 进入SYN_RECV状态。
第三次:客户端收到服务器的SYN包,向服务器发送确认,此包发送完毕,回应一个ACK报文,客户端和服务器端进入ESTABLISHED状态。
(3)特点
① TCP传输数据没有大小的限制,一旦连接建立起来,双方的Socket就可以按照统一的格式传输大的数据。
② TCP是可靠的协议它确保接收方完全正确的获取发送方所发送的全部数据。
③ TCP在网络通信上有极强的生命力的。如远程连接(TeLnet) 和 文件的传输(FTP) 都需要不定长度数据被可靠的传输,但是可靠的传输,需要付出代价,对数据的内容中正确性的检验必然需要占用计算的处理时间和网络宽带,所以TCP传输的效率不如UDP高。
2、UDP
(1)UDP (User Datagram Protocol) 是一种 无连接协议,每个数据报都是一个独立的信息,包括完整的源地址或目的地址,在网络以任何可能的路径传往目的地址,因此能否到达的地,到达目的地址的时间以及内容的正确性都是不能被保证。
(2)特点
① 由于使用UDP协议消耗资源小,通信效率高,所以通常都会用于音频、视频和普通数据的传输例如视频会议都使用UDP协议,因为这种情况即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响。
② 在使用UDP协议传送数据时,由于UDP的面向无连接性,不能保证数据的完整性,因此在传输重要数据时,不建议使用UDP协议。
③ 特点:数据被限制在64kb以内,超出这个范围就不能发送了。
④ UDP 操作简单,而且仅需要少量的监护,所以通常用于局域网高可靠性的分散系统中,比如 视频会议。
三、TCP网络编程
1、概述
TCP通信能实现两台计算机之间的数据交互,通信的两端,要严格区分为客户端(Client)与服务端(Server)。
(1)两端通信时步骤:
① 服务端程序,需要事先启动,等待客户端的连接。
② 客户端主动连接服务器端,连接成功才能通信。服务端不可以主动连接客户端。
(2)在Java中,提供了两个类用于实现TCP通信程序:
① 客户端:java.net.Socket 类表示。创建Socket对象,向服务端发出连接请求,服务端响应请求,两者建立连接开始通信。
② 服务端:java.net.ServerSocket 类表示。创建ServerSocket对象,相当于开启一个服务,并等待客户端的连接。
2、Socket类
常用方法
(1)getInputStream():返回输入流
(2)getOutputStream():返回输出流
(3)close():关闭
(4)shutdownOutput():禁用输出流
3、ServerSocket类
等待通过网络的请求
常用方法
(1)accept():监听并接受连接,返回一个新的Socket对象,用于和客户端实现通信,该方法会一直阻塞直到建立连接。
4、接收数据
(1)建立ServerSocket连接,并指定端口号
(2)等待客户端通信
(3)打开输入流
(4)读取客户端发送信息
(5)关闭资源
5、发送数据
(1)建立Socket对象,指定地址和端口号
(2)打开输出流
(3)构建要写入的内容
(4)调用writer()方法写入
(5)关闭资源
四、UDP网络编程
1、DatagramSocket类
构造方法
DatagramSocket():无参构造方法
DatagramSocket(int port):指定端口号
DatagramSocket(int port,InetAddress ia):指定端口号和IP地址
2、DatagramPacket类
(1)构造方法
DatagramPacket(byte[] b, int length):数据包中的数据和长度
DatagramPacket(byte[] b, int length, InetAddress ad, int port):数据包中的数据、长度、IP地址和端口号
(2)常用方法
getData():返回数据包中的数据
getAddress():返回该数据包发送或接收数据包的IP地址
3、发送数据
(1)创建发送端socket对象——DatagramSocket,设置端口号
(2)创建数据并打包到DatagramPacket对象
(3)通过调用send()方法发送
(4)释放资源
4、接收数据
(1)创建接收端socket对象——DatagramSocket
(2)创建需要发送的数据包对象
(3)调用receive()方法接收数据
(4)构建一个字符串,解析数据包对象,获取信息
(5)释放资源