网络编程
- 网络编程
- IP地址
- 端口
- 协议
- UDP通信程序
- TCP通信程序
- 服务器端优化
- NIO
网络编程
网络编程:在网络通信协议下,不同计算机上运行的程序,可以进行数据传输
网络编程三要素
IP地址:设备在网络中的地址,是唯一的标识。是分配给上网设备的数字标签。
端口:应用程序在设备中唯一的标识。
协议:数据在网络中传输的规则,常见的协议有UDP协议和TCP协议。
IP地址
常用命令:
⚫ ipconfig:查看本机IP地址
⚫ ping IP地址:检查网络是否连通
特殊IP地址:
⚫ 127.0.0.1:是回送地址也称本地回环地址,可以代表本机的IP地址,一般用来测试使用
加一个ipv4的分类,需要讲A-E,IP组成为:网络号 + 主机号广域网 城域网 局域网最大的广域网是因特网
添加组播地址,广播地址
InetAddress 的使用:此类表示Internet协议(IP)地址
static InetAddress getByName(String host) 确定主机名称的IP地址。主机名称可以是机器名称,也可以是IP地址String getHostName() 获取此IP地址的主机名String getHostAddress() 返回文本显示中的IP地址字符串
端口
端口:应用程序在设备中唯一的标识。
端口号:用两个字节表示的整数,它的取值范围是065535。其中01023之间的端口号用于一些知名的网络服务或者应用。我们自己使用1024以上的端口号就可以了。注意:一个端口号只能被一个应用程序使用。
协议
协议:计算机网络中,连接和通信的规则被称为网络通信协议
UDP协议
⚫ 用户数据报协议(User Datagram Protocol)
⚫ UDP是面向无连接通信协议。速度快,有大小限制一次最多发送64K,数据不安全,易丢失数据。
TCP协议
⚫ 传输控制协议 (Transmission Control Protocol)
⚫ TCP协议是面向连接的通信协议。速度慢,没有大小限制,数据安全。
UDP通信程序
UDP发送数据
- 创建发送端的DatagramSocket对象
- 创建数据,并把数据打包(DatagramPacket)
- 调用DatagramSocket对象的方法发送数据
- 释放资源
UDP接收数据
- 创建接收端的DatagramSocket对象
- 创建一个箱子,用于接收数据
- 调用DatagramSocket的方法接收数据并将数据放入箱子中
- 解析数据包,并把数据在控制台显示
- 释放资源
UDP的三种通信方式
⚫ 单播
⚫ 组播
⚫ 广播
UDP通信组播代码实现
组播地址:224.0.0.0 ~ 239.255.255.255
其中224.0.0.0 ~ 224.0.0.255 为预留的组播地址
单播的发送端
① 创建发送端的Socket对象(DatagramSocket)
② 创建数据,并把数据打包(DatagramPacket)
③ 调用DatagramSocket对象的方法发送数据
注意:在单播中,这里是发给指定IP的电脑但是在组播当中,这里是发给组播地址
④ 释放资源
单播的接收端:
① 创建接收端的Socket对象(DatagramSocket)DatagramSocket ds = new DatagramSocket(10086);
② 创建一个箱子,用于接收数据DatagramPacket dp = new DatagramPacket(new byte[1024], 1024);
③ 调用DatagramSocket的方法接收数据并将数据放入箱子中ds.receive(dp);
④ 解析数据包,并把数据在控制台显示byte[] data = dp.getData();System.out.println(new String(data,0,dp.getLength()));new MulticastSocket(10086);
⑤ 释放资源
UDP通信广播代码实现
① 创建发送端的Socket对象(DatagramSocket)
② 创建数据,并把数据打包(DatagramPacket)
③ 调用DatagramSocket对象的方法发送数据
注意:在单播中,这里是发给指定IP的电脑但是在广播当中,这里是发给广播地址
④ 释放资源
广播地址:255.255.255.255
TCP通信程序
TCP通信协议是一种可靠的网络协议,它在通信的两端各建立一个Socket对象。通信之前要保证连接已经建立。通过Socket产生IO流来进行网络通信。
TCP发送数据步骤
① 创建客户端的Socket对象(Socket)与指定服务端连接Socket(String host, int port)
② 获取输出流,写数据OutputStream getOutputStream()
③ 释放资源void close()
TCP接收数据
① 创建服务器端的Socket对象(ServerSocket)ServerSocket(int port)
② 监听客户端连接,返回一个Socket对象Socket accept()
③ 获取输入流,读数据,并把数据显示在控制台InputStream getInputStream()
④ 释放资源void close()
三次握手
- 客户端向服务器发出连接请求等待服务器确认
- 服务器向客户端返回一个响应告诉客户端收到了请求
- 客户端向服务器再次发出确认信息连接建立
四次挥手
- 客户端向服务器发出取消连接请求
- 服务器向客户端返回一个响应表示收到,客户端取消请求
- 服务器向客户端发出确认取消信息
- 客户端再次发送确认消息,连接取消
服务器端优化
- 服务器只能处理一个客户端请求,接收完一个图片之后,服务器就关闭了。改进:循环
- 第二次上传文件的时候,会把第一次的文件给覆盖。改进:UUID. randomUUID()方法生成随机的文件名
- 使用循环虽然可以让服务器处理多个客户端请求。但是还是无法同时跟多个客户端进行通信。改进:开启多线程处理
- 使用多线程虽然可以让服务器同时处理多个客户端请求。但是资源消耗太大。改进:加入线程池
NIO
我们之前学习的IO,称之为:BIO(Blocking IO)阻塞型IO。NIO(Non Blocking IO) 非阻塞性IO
BIO与NIO的区别
- 区别一:BIO是阻塞的,NIO是非阻塞的
- 区别二:BIO是面向流的,NIO是面向缓冲区的BIO中数据传输是单向的,NIO中的缓冲区是双向的
NIO之缓冲区
static ByteBuffer allocate(长度) 创建byte类型的缓冲区static ByteBuffer wrap(byte[] array) 创建一个有内容的byte类型缓冲区
- capacity:容量(长度)
- limit: 界限(最多能读/写到哪里)
- posotion:位置(读/写哪个索引)
将数据添加到缓冲区
获取缓冲区中的数据
rewind() 将position设置为0,可以重复读clear() 数据读写完毕(读->写)array() 将缓冲区转换成字节数组返回
获取缓冲区里面数据之前,需要调用flip方法
再次写数据之前,需要调用clear方法,但是数据还未消失,等再次写入数据,被覆盖了才会消失。
NIO之通道
- 打开一个服务端通道
- 绑定对应的端口号
- 通道默认是阻塞的,需要设置为非阻塞
- 此时没有门卫大爷,所以需要经常看一下有没有连接发过来没?
- 如果有客户端来连接了,则在服务端通道内部,再创建一个客户端通道,相当于是客户端通道的延伸
- 客户端将缓冲区通过通道传递给服务端
- 服务端创建一个空的缓冲区装数据并输出
NIO之选择器
- Selector选择器对象
- SelectionKey绑定通道后返回的key
- SelectableChannel能使用选择器的通道SocketChannel,ServerSocketChannel
选择器改写服务端
- 打开一个服务端通道(open)
- 绑定对应的端口号
- 通道默认是阻塞的,需要设置为非阻塞
- 打开一个选择器(门卫大爷)以上步骤中,服务端通道和门卫大爷还没有任何关系
- 将选择器绑定服务端通道,并监视服务端是否准备好
- 如果有客户端来连接了,大爷会遍历所有的服务端通道,谁准备好了,就让谁来连接连接后,在服务端通道内部,再创建一个客户端延伸通道
- 如果客户端把数据传递过来了,大爷会遍历所有的延伸通道,谁准备好了,谁去接收数据
- 选择器监视客户端通道
- 选择器监视服务端通道
- 选择器监视客户端延伸通道
非阻塞的HTTP服务器
就是NIO服务器.HTTP:互联网传输数据的一种规则
HTTP协议
是互联网传输数据的一种规则。是基于TCP/IP协议由请求和响应组成
URL统一资源定位符
组成:协议 域名 端口号 请求资源路径(URI统一资源标识符)
抓包工具
HTTP请求协议
- 请求行
- 请求方式 get post
- URI 如果省略就是默认资源
- 协议版本 HTTP1.1
- 请求头部
- Host用来指定请求的服务端地址
- Connection取值为keep-alive表示需要持久连接
- User-Agent客户端的信息
- Accept指定客户端能够接收的内容类型
- Accept-Encoding指定浏览器可以支持的服务器返回内容压缩编码类型
- Accept-Language浏览器可接受的语言
- 请求空行 空行
- 请求体 GET没有请求体
HTTP响应协议
- 响应行
- 协议版本HTTP1.1
- 响应状态码200,404,500
- 状态消息状态码对应的消息
- 响应头部
- Content-Type
- text/html —-> 文本类型
- image/png —-> png格式文件
- image/jpeg —-> jpg格式文件
- Content-Type
- 响应空行 空行
- 响应体
HTTP服务器
封装请求头
封装响应