2.3 UDP套接字

实际上UDP只实现两个功能:*
1. 在IP协议的基础上添加一层地址(端口);
2. 在数据传输过程中可能产生的数据错误进行检测,并抛弃已损坏的数据。

与TCP不同的特征:
1. UDP套接字在使用前不需要进行连接。TCP类似通话,而UDP像邮件通信。
2. 对信息边界的处理方式不同:UDP套接字将保留边界信息,这个特性使得应用程序在接收信息时,某些方面比TCP套接字更简单。
3. UDP协议提供的端到端传输服务是尽力而为的,不保证成功,不保证顺序正确。

为什么使用UDP?
1. 效率,TCP要传输两倍于UDP的信息量,还有两倍的往返延迟时间。
2. 灵活性:提供一个最小开销的平台。

2.3.1 DatagramPacker类

  1. 客户端和服务端都使用DatagramSocket来发送数据;使用DatagramPacker接收数据。
  2. 与TCP协议发送与接收字节流不同,UDP终端通过交换数据报文通信。
  3. 发送时:创建包含发送信息的DatagramPacker,作为参数传入DatagramSocket的send()方法;
  4. 接收时:创建Datagram实例,预置空间,将信息放入该控件,然后把Datagram实例作为参数放入DatagramSocket的receive()方法。
  5. 除了信息本身外,每个DatagramPacker还附加了地址和端口信息。

DatagramPacket:创建

// 主要用于接收端,length可能比data.length小,但不能比后者大,其他构造函数同此。
DatagramPacket(byte[] data, int length);
DatagramPacket(byte[] data, int offset, int length);

// 主要用于发送端
DatagramPacket(byte[] data, int length, InetAddress remoteAddr, int remotePort);
DatagramPacket(byte[] data, int offset, int length, InetAddress remoteAddr, int remotePort);
DatagramPacket(byte[] data, int length, SocketAddress socketAddr);
DatagramPacket(byte[] data, int offset, int length, SocketAddress socketAddr);

DatagramPacker:处理地址

InetAddress getAddress();
void setAdderss(InetAddress address);
int getPort();
void setPort();
SocketAddress getSocketAddress();
void setSocketAddress(SocketAddress socketAddr);

需要注意,DatagramSocket的receive()方法时将其地址和端口设置为数据报发送者的地址和端口。

DatagramPacker:处理数据

// 前两个方法返回和设置数据报文中数据部分的长度,若试图将其设置得比相关联的缓存区长度更大,会抛出IllegalArgumentException异常。
int getLength();
void setLength(int length);
int getOffset();//返回存放到缓冲区的偏移量
byte[] getData();
void setData(byte[] data);
void setData(byte[] buffer, int offset, int length);

DatagramSocket在两个方面使用receive(),如果用于发送数据,用来指定接收方最大缓冲长度;如果用于接收数据,指示实际存入缓冲区的字节数。

2.3.2 UDP客户端

主要执行以下三步:
1. 创建DatagramSocket实例,可以选择对本地地址和端口进行设置。
2. 使用DatagramSocket的send()和receive()方法发送和接收DatagramPacker实例;
3. 通信完成后,执行DatagramSocket的close方法销毁套接字。

与Socket类不同,DatagramSocket实例在创建时,并不需要指定目的地址,这也是TCP协议与UDP协议最大的不同点之一。
TCP在数据交换前,必须与对方建立连接,并且在连接关闭之前,该套接字只能与相连接的那个套接字通信。而UDP套接字在通信前不需要建立连接,每个数据报文都可以发送到或接收于不同的目的地址。

示例程序

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值