Java网络编程
网络编程
- 可以让设备中的程序与网络上其他设备中的程序进行数据交互的技术(实现网络通信)。
基本的通信框架
- 基本的通信架构有2种形式:CS架构( Client客户端/Server服务端 ) 、 BS架构(Browser浏览器/Server服务端
- Client-Server(CS)架构
- Client-Server(CS)架构
- 需要程序员开发客户端软件
- 需要用户下载安装客户端软件
- Server服务端
- 需要程序员开发服务端程序
- Client-Server(CS)架构
- Browser-Server(BS)架构
- Browser浏览器
- 不需要程序员开发
- 需要用户下载安装浏览器
- Server服务端
- 需要程序员开发服务端程序
- Browser浏览器
- Client-Server(CS)架构
- 无论是CS架构,还是BS架构的软件都必须依赖网络编程。
- java.net.*包下提供了网络编程的解决方案
网络编程三要素
- IP地址:设备在网络中的地址,是设备在网络中的唯一标识。
- 端口: 应用程序在设备中的唯一标识。
- 协议:连接和数据在网络中传输的规则。
IP
- (Internet Protocol):全称”互联网协议地址”,是分配给上网设备的唯一标识。
- 目前,被广泛采用的IP地址形式有两种:IPv4、IPv6。
- IPv4是Internet Protocol version 4的缩写,它使用32位地址,通常以点分十进制表示。
- IPv4是Internet Protocol version 4的缩写,它使用32位地址,通常以点分十进制表示。
- IPv6是Internet Protocol version 6的缩写,它使用128位地址,号称可以为地球上的每一粒沙子编号。
IPv6分成8段,每段每四位编码成一个十六进制位表示, 每段之间用冒号(:)分开,将这种方式称为冒分十六进制。 - IP域名(Domain Name)
- 用于在互联网上识别和定位网站的人类可读的名称。
- DNS域名解析(Domain Name System)
- 是互联网中用于将域名转换为对应IP地址的分布式命名系统。它充当了互联网的“电话簿”,将易记的域名映射到数字化的IP地址,使得用户可以通过域名来访问网站和其他网络资源。
- 公网IP:是可以连接到互联网的IP地址;
- 内网IP:也叫局域网IP,是只能组织机构内部使用的IP地址;例如,192.168. 开头的就是常见的局域网地址,范围为192.168.0.0–192.168.255.255,专门为组织机构内部使用。
- 本机IP :127.0.0.1、localhost:代表本机IP,只会寻找当前程序所在的主机。
- IP常用命令
- ipconfig:查看本机IP地址。
- ping IP地址:检查网络是否连通。
- InetAddress
- 代表IP地址。
InetAddress类的常用方法 | 说明 |
---|---|
public static InetAddress getLocalHost() throws UnknownHostException | 获取本机IP,返回一个InetAddress对象 |
public String getHostName() | 获取该ip地址对象对应的主机名。 |
public String getHostAddress() | 获取该ip地址对象中的ip地址信息。 |
public static InetAddress getByName(String host) throws UnknownHostException | 根据ip地址或者域名,返回一个inetAddress对象 |
public boolean isReachable(int timeout) throws IOException | 判断主机在指定毫秒内与该ip对应的主机是否能连通 |
端口
- 用来标记标记正在计算机设备上运行应用程序,被规定为一个 16 位的二进制,范围是 0~65535。
- 作用:唯一标识正在计算机设备上运行的进程(程序
- 端口分类
- 周知端口:0~1023,被预先定义的知名应用占用(如:HTTP占用 80,FTP占用21)
- 注册端口:1024~49151,分配给用户进程或某些应用程序。
- 动态端口:49152到65535,之所以称为动态端口,是因为它一般不固定分配某种进程,而是动态分配。
- 自己开发的程序一般选择使用注册端口,且一个设备中不能出现两个程序的端口号一样,否则报错。
通信协议
- 网络上通信的设备,事先规定的连接规则,以及传输数据的规则被称为网络通信协议。
- 开放式网络互联标准:OSI网络参考模型
- OSI网络参考模型:全球网络互联标准。
- TCP/IP网络模型:事实上的国际标准。
OSI 网络参考模型 | TCP/IP 网络模型 | 各层对应 | 面向操作 |
---|---|---|---|
应用层 | 应用层 | HTTP、FTP、SMTP… | 应用程序需要关注的:浏览器,邮箱。程序员一般在这一层开发 |
表示层 | 应用层 | HTTP、FTP、SMTP… | 应用程序需要关注的:浏览器,邮箱。程序员一般在这一层开发 |
会话层 | 应用层 | HTTP、FTP、SMTP… | 应用程序需要关注的:浏览器,邮箱。程序员一般在这一层开发 |
传输层 | 传输层 | UDP 、 TCP… | 选择使用的TCP , UDP协议 |
网络层 | 网络层 | IP… | 封装源和目标IP |
数据链路层 | 数据链路层+ 物理层 | 比特流… | 物理设备中传输 |
物理层 | 数据链路层+ 物理层 | 比特流… | 物理设备中传输 |
- 传输层的2个通信协议
- UDP(User Datagram Protocol):用户数据报协议。
- 速度快,有大小限制一次最多发送64K,数据不安全,易丢失数据。
- TCP(Transmission Control Protocol) :传输控制协议。
- 通信效率相对较低,可靠性相对较高。
- UDP(User Datagram Protocol):用户数据报协议。
TCP协议
- 特点:面向连接、可靠通信。
- TCP的最终目的:要保证在不可靠的信道上实现可靠的数据传输。
- TCP主要有三个步骤实现可靠传输:三次握手建立连接,传输数据进行确认,四次挥手断开连接。
-
三次握手建立可靠连接
- 可靠连接:
确保通信的双方收发消息都是没问题的(全双工) - 目的:传输数据会进行确认,以保证数据传输的可靠性
- 客户端 ——> 发出确认断开信息,连接断开 ——> 服务器
- 客户端 <—— 返回一个响应 <—— 服务端
- 客户端 ——> 再次发出确认信息,连接建立 ——> 服务器
- 可靠连接:
-
四次挥手断开连接
- 目的:确保通信的双方收发消息都已经完成
- 客户端 ——> 放出连接请求 ——> 服务器
- 客户端 <—— 返回一个响应:稍等 <—— 服务端
- 客户端 <——返回一个响应:消息处理完毕,确认断开 <—— 服务端
- 客户端 ——> 再次发出确认信息,连接建立 ——> 服务器
- 目的:确保通信的双方收发消息都已经完成
-
UDP协议
- 特点:无连接、不可靠通信。
- 不事先建立连接,数据按照包发,一包数据包含:自己的IP、端口、目的地IP、端口和数据(限制在64KB内)等。
- 发送方不管对方是否在线,数据在中间丢失也不管,如果接收方收到数据也不返回确认,故是不可靠的 。
- 速度快,有大小限制一次最多发送64K,数据不安全,易丢失数据。
UDP通信的实现
- 特点:无连接、不可靠通信。
- 不事先建立连接;发送端每次把要发送的数据(限制在64KB内)、接收端IP、等信息封装成一个数据包,发出去就不管了。
- Java提供了一个java.net.DatagramSocket类来实现UDP通信。
- DatagramSocket: 用于创建客户端、服务端
构造器 | 说明 |
---|---|
public DatagramSocket() | 创建客户端的Socket对象, 系统会随机分配一个端口号。 |
public DatagramSocket(int port) | 创建服务端的Socket对象, 并指定端口号 |
方法 | 说明 |
---|---|
public void send(DatagramPacket dp) | 发送数据包 |
public void receive( DatagramPacket p) | 使用数据包接收数据 |
- DatagramPacket:创建数据包
构造器 | 说明 |
---|---|
public DatagramPacket(byte[] buf, int length, InetAddress address, int port) | 创建发出去的数据包对象 |
public DatagramPacket(byte[] buf, int length) | 创建用来接收数据的数据包 |
方法 | 说明 |
---|---|
public int getLength() | 获取数据包,实际接收到的字节个数 |
客户端实现步骤
- 创建DatagramSocket对象(客户端对象)
- 创建DatagramPacket对象封装需要发送的数据(数据包对象)
- 使用DatagramSocket对象的send方法,传入DatagramPacket对象
- 释放资源
服务器实现步骤
- 创建DatagramSocket对象并指定端口(服务端对象)
- 创建DatagramPacket对象接收数据(数据包对象)
- 使用DatagramSocket对象的receive方法,传入DatagramPacket对象
- 释放资源
- UDP多发多收
- 接收端只负责接收数据包,无所谓是哪个发送端的数据包。
TCP 通信
- 特点:面向连接、可靠通信。
- 通信双方事先会采用“三次握手”方式建立可靠连接,实现端到端的通信;底层能保证数据成功传给服务端。
- Java提供了一个java.net.Socket类来实现TCP通信。
- 客户端程序就是通过java.net包下的Socket类来实现的。
构造器 | 说明 |
---|---|
public Socket(String host , int port) | 根据指定的服务器ip、端口号请求与服务端建立连接,连接通过,就获得了客户端socket |
方法 | 说明 |
---|---|
public OutputStream getOutputStream() | 获得字节输出流对象 |
public InputStream getInputStream() | 获得字节输入流对象 |
- 服务端是通过java.net包下的ServerSocket类来实现的。
构造器 | 说明 |
---|---|
public ServerSocket(int port) | 为服务端程序注册端口 |
方法 | 说明 |
---|---|
public Socket accept() | 阻塞等待客户端的连接请求,一旦与某个客户端成功连接,则返回服务端这边的Socket对象。 |
客户端通信的实现
- 创建客户端的Socket对象,请求与服务端的连接。
- 使用socket对象调用getOutputStream()方法得到字节输出流。
- 使用字节输出流完成数据的发送。
- 释放资源:关闭socket管道。
服务端通信的实现
- 创建ServerSocket对象,注册服务端端口。
- 调用ServerSocket对象的accept()方法,等待客户端的连接,并得到Socket管道对象。
- 通过Socket对象调用getInputStream()方法得到字节输入流、完成数据的接收。
- 释放资源:关闭socket管道
TCP多发多收
- 客户端使用死循环,让用户不断输入消息。
- 服务端也使用死循环,控制服务端程序收完消息后,继续去接收下一个消息。