网络编程
1.网络编程概述
1.1 C/S和B/S
C/S 客户端 服务器软件结构 服务提供商给予用户服务需要准备的内容
- 各大平台的客户端 Android iOS PC Windows Linux macOS
QQ 微信 淘宝 JD 剑与远征 - 服务器提供服务 软件更新: LOL服务器版本更新,同时本地软件也要进行更新操 作。这个操作非常耗时。 热更新
B/S 浏览器 服务器软件结构 服务提供商只要提供数据服务就OK,以及前端数据展示 方式 - 浏览器提供商非常非常多 谷歌,火狐,欧朋,Safari,Edge
- 服务器提供服务 软件更新: 服务器更新数据,浏览器刷新就ok了
1.2 网络通信协议
协议: protocol协议
网络通信协议是要求双方传递数据的计算机必须遵守的, 按照对应的网络传输协议,才可以进入数据的交互和传递。
目前网络端数据传输比较常见的协议: UDP TCP/IP
1.3 UDP和TCP/IP区别
UDP
- 面向无连接,数据传递不算特别安全
- 因为面向无连接,传输速度快
- 因为面向无连接,数据传递存在丢包问题
- UDP没有客户端和服务器区别,都可以作为发送端和 接收端
UDP协议使用场景 直播,网络游戏
TCP/IP - 面向连接,数据传递较为安全
- 因为面向连接,所有传递速度较慢
- 面向连接,数据传递有保障
- TCP/IP协议是有明确的服务器和客户端概念
TCP/IP协议使用场景 客户端登陆,数据下载,文件传输
1.4 网络编程的三要素
- 协议
两个在于网络情况下的计算机数据传递,都需要对应的协 议来完成。 - IP地址
Internet Protocol Address
当前计算机在网络中的一个地址编号,类似于手机号号码 IP地址有IPv4协议和IPv6协议 IPv4是一个32位的二进制数,通常展示效果是a.b.c.d 例如 192.168.1.1
a.b.c.d 各代表0 ~ 255的数字,目前已经消耗殆尽 42 亿个
IPv6 IPv6是能够保证地球上的每一粒沙子都有一个IP地址。
128位地址长度,16字节一组 8组 0x0 ~ 0xFFFF - 端口号
端口号是当前应用程序在计算机中的一个编号。可以让计算机明确知道,当前的数据是给予那一个程序使用,或者数据 从哪一个程序出现的。
端口号是一个short类型 0 ~ 65535
!!!0~1024不能用于自定义端口号使用,特定的系统端口号
2. IP类
SUN公司提供给开发使用的IP地址类
InetAddress 常用方法:
InetAddress getLocalhost(); 获取本机IP地址类对象
InetAddress getByName(String str); 根据指定的主机名获取对应的IP地址对象
InetAddress[] getAllByName(String str); 获取指定主机名,或者域名对应的所有IP地址类对象
3. UDP协议数据传输
3.1 UDP数据传输方式
User Datagram Protocol
数据传递采用数据包方式传递,所有的数据要进行打包操 作,并且没有对应的客户端服务器概念,
有且只有发送段和接收端
Socket 套接字 数据需要进行传递操作,在数据传递的两台计算机当中必须有对应的Socket。
这里采用UDP协议,那么必须有一个UDP 协议的Socket
DatagramSocket(); 创建一个发送端UDP协议Socket对象
DatagramSocket(int port); 创建一个接收端UDP协议的Socket对象,这里需要 【监听】指定端口
发送端数据包的打包方法:
DatagramPacket DatagramPacket(byte[] buf, int length, InetAddress address, int port);
buf: 需要传递数据的字节数组
length:是当前字节数组中数据容量字节数
address:接收端IP地址对象
port: 接收端对应的端口号
接收端数据包接收方式 这里需要准备一个空的数据包
DatagramPacket DatagramPacket(byte[] buf, int length);
buf: 字节缓冲数组,通常是1024整数倍 length: 当前字节缓冲数组的容量
3.2 发送端
流程:
- 创建UDP服务器对应的发送端Socket
- 准备对应数据包,需要带有指定数据
- 发送数据 send
- 关闭UDP发送端
3.3 接收端
流程:
- 打开UDP服务,并且监听指定端口
- 创建新的空数据包
- 通过Socket接收数据
- 关闭UDP服务接收端
3.4 UDP数据传递丢失问题
- 网络不够好,稳定性不行,带宽不够 2. 电脑性能不好
3.5FeiQ
网络传输都有自己的传输规格,如果软件接受到的数据是自己 的规格,那么可以读取数据 如果不是,丢弃!!!
FeiQ version:time:sender:ip:flag:content
版本:时间:发送者名字:发送人IP:标记:内容
数据是一个String类型
而且使用的协议是UDP协议
4.TCP
4.1TCP概述
TCP相对于UDP比较稳定的传输协议,这里存在三次握 手,保证连接状态,同时有明确的客户端和服务端之分
TCP服务中需要服务器端先启动,需要监听指定端口,等 待客户端连接。
客户端主动连接服务器,和服务器连接之后,才可以进行 数据交互,服务器不能主动连接客户端的。
TCP操作而言,Java中提供了两个Socket
- 服务端Socket java.net.ServerSocket;
创建对应的ServerScoket开启服务器,等待客户端 连接 - 客户端Socket java.net.Socket
创建客户端Scoket,并且连接服务器,同时将 Socket发送给服务器绑定注册。
4.2Socket客户端Soclet
给客户端提供数据传输的符合TCP/IP要求的Socket对象
构造方法 Constructor
Socket(String host, int port);
host是服务器IP地址,port对应服务器程序的端口 号
通过指定的服务器IP地址和端口号,获取TCP连接对 象
成员方法 Method
InputStream getInputStream(); 获取Socket对象输入字节流,可以从服务器获取对 应的数据
InputStream是一个资源,需要在程序退出是关闭
Read
OutputStream getOutputStream(); 获取Sokcet对象输出字节流,可以发送数据到服务器
OutputStream是一个资源,需要在程序退出是关闭 Write
void close(); 关闭客户端Socket void shutdownOutput(); 禁止当前Socket发送数据
TCP/IP协议对应的Socket是给予IO流实现的。
4.3 ServerSocket服务端Socket
在服务端开启Socket服务器
构造方法 Constructor:
ServerSocket(int port); 开启ServerSocket服务器,并且明确当前服务端口 是谁
成员方法 Method:
Socket accept(); 监听并且连接,得到一个Socket对象,同时该方法 是一个阻塞方法,会处于一个始终的监听状态 返回的是Socket,也就是客户端Socket对象,获取到当前Socket对象,相对于获取到客户端连接,同时使用的Socket和客户端一致。
4.4 TCP协议代码演示
4.4.1 服务器代码
流程:
- 创建ServerSocket服务器,同时监听指定端口
- 通过accept方法获取Socket连接,得到客户端 Socket对象
- 通过Socket对象,获取InputStream,读取客户端发送数据
- 通过Socket对象,获取OutputStream,发送数据给 客户端
- 关闭服务
4.4.2 客户端代码
流程:
- 创建Socket服务,同时明确连接服务器的IP地址和对应端口号
- 通过Socket对象,获取对应的OutputStream对象, 发送数据给服务器
- 通过Socket对象,获取对应的InputStream对象,接收服务器发送数据
- 关闭服务