Socket网络编程 2
Socket-UDP 快速入门
UDP是什么?
- 英文名:User Datagram Protocol,缩写为UDP
- 一种用户数据报协议,又称用户数据报文协议。
- 是一个简单的面向数据报的传输层协议,正式规范为RFC 768
- 用户数据协议、非连接协议
为什么说UDP不可靠?
- 它一旦把应用程序发送给网络层的数据发送出去,就不保留数据备份
- UDP在IP数据报的头部仅仅加入了复用和数据校验(字段)
- 发送端生成数据,接收端从网络中抓取数据
- 结构简单,无校验,速度快,容易丢包,可广播
UDP能做什么?
- DNS,TFTP,SNMP
- 视频,音频,普通数据(无关紧要数据)
UDP包最大长度
- 16位->2字节 存储长度信息
- 2^16-1=64K-1=65536-1=65535
- 自身协议占用:32+32位=64位=8字节
- 65535-8=65507byte
UDP核心API
DatagramSocket
- 用于接收与发送UDP的类
- 负责发送某一个UDP包,或者接收UDP包
- 不同于TCP,UDP并没有合并到Socket API中
- DatagramSocket()创建简单实例,不指定端口与IP
- DatagramSocket(int port)创建监听固定端口的实例
- DatagramSocket(int port,InetAddress localAddr)创建固定端口指定IP的实例
- receive(DatagramPacket d):接收
- send(DatagramPacket d):发送
- setSoTimeout(int timeout):设置超时,毫秒
- close():关闭,释放资源
DatagramPacket
- 用于处理报文
- 将byte数组,目标地址,目标端口等数据包装成报文或者将报文拆卸成byte数组
- 是UDP的发送实体,也是接收实体
- DatagramPacket(byte[] buf,int offset,int length,InetAddress address,int port)
- 前三个参数指定buf的使用区间
- 后面2个参数指定目标机器地址与端口
- DatagramPacket(byte[] buf,int offset,int length,SocketAddress address)
- SocketAddress相当于InetAddress+Port
- setData(byte[],int offset,int length)
- setData(byte[] buf)
- setLength(int length)
- getData(),getOffset(),getLength()
- setAddress(InetAddress iaddr),setPort(int iport) 发送时有效
- getAddress(),getPort()
- setSocketAddress(SocketAddress address) 发送时有效
- getSocketAddress()
UDP单播、广播、多播
- 单播:点对点
- 多播:给一组用户发送,组播
- 广播:给所有设备发送信息
IP地址类别
广播地址
- 255.255.255.255为受限广播地址
- C网广播地址一般为:xxx.xxx.xxx.255(192.168.1.255)
- D类IP地址为多播预留
IP地址构成
广播地址运算
- IP:192.168.124.7
- 子网掩码:255.255.255.0
- 网络地址:192.168.124.0
- 广播地址:192.168.124.255
========== - IP:192.168.124.7
- 子网掩码:255.255.255.192
- 网络地址:192.168.124.0
- 广播地址:192.168.124.63
========== - 255.255.255.192->11111111.11111111.11111111.11000000
- 可划分网段:2^2=4个
- 0~63,64~127,~128-191,192-255
- 广播地址:192.168.124.63
广播通信问题
- 主机一:192.168.124.7,子网掩码:255.255.255.192
- 主机一:192.168.124.100,子网掩码:255.255.255.192
- 主机一广播地址:192.168.124.63
- 主机二广播地址:192.168.124.127