网络编程

    • 网络编程
      • 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格式文件
  • 响应空行 空行
  • 响应体

HTTP服务器
封装请求头
封装响应