UDP网络编程DatagramSocket及DatagramPacket的简单使用

1,079 阅读5分钟

前言: 之前我们讲过使用TCP网络编程的有关用法,讲了如何使用ServerSocket和Socket来构建服务端和客户端,以及如何使用字节输入输出流来接收和发送数据. 今天我将讲述如何使用UDP网络编程实现简单的发送数据和接收来自客户端或服务端的数据.

一、UDP和TCP网络通信比较

从图中可以看到,TCP和UDP第一个区别就是TCP是面向连接的编程,UDP是面向非连接的编程.

面向连接意思就是必须先开启服务端,然后通过连接服务端才可以发送消息和接收消息,同理,面向非连接意思就是可以在不开启服务器的情况下,直接向指定的地址(包括IP地址和端口号)发送消息.

是否连接带来的直接影响就是TCP传输消息可靠,UDP传输消息不可靠;因为UDP在不开服务器的情况下,客户端发送的信息服务端是否接收到是不可知的.TCP通信必须先开启服务器才能连接,所以服务端一定可以接收到客户端的消息.

同理.因为TCP需要先开启服务端才能发送消息,所以它的通信速度相对较慢,而UDP不需要通过确认服务端是否开启,直接向其发送数据,所以它的数据传输速度相对较快,只是无法确认服务端是否接收到消息.

TCP和UDP的具体使用分场景,可以根据实际需求选择不同的方式.

二、UDP通信实现步骤

UDP通信整体包含了: 使用DatagramPacket类对象来封装数据,这当中需要定义一个字节数组来存放数据,再将数组放到数据包中;

使用DatagramSocket类对象来发送数据包,使用其send()方法发送;

使用DatagramSocket类对象来接收数据包,使用其receive()方法发送数据包;

使用DatagramPacket来处理数据包,获取数据包之后便可以解析数据,解析时获取包中数据使用它的getData()方法,之后便可将数据所在数组转为字符串输出即可。

三、UDP网络通信实现

第一部分:服务端构建及向客户端发消息

如下图,我使用try…catch来抓取异常,整个代码块放在了try语句下

(1)创建服务端 使用DatagramSocket来创建一个服务端,并且需指定服务端的端口号(用于客户端接入)

(2)接受客户端发送的数据 接受数据使用DatagramSocket的receive()方法.需向方法里传入一个DatagramPacket的参数,所以在这之前我们需要创建DatagramPacket类对象,在构造这个对象时需传入一个存储数据的字节数组,所以最开始需要定义一个数组用于存储数据。

获取到数据包之后便可以对其解析,使用Datagrampacket的getData()方法即可得到一个包含数据的字节数组,然后即可将其转为字符串输出了

第二部分:客户端接收服务端数据

(1) 构建客户端: 同样,通过DatagramPacket构建客户端,不过需注意的是在这里不能直接指定服务端地址,否则会重新创建一个和服务端相同的端口号,发生冲突;下述过程中会连接服务端

(2) 向服务端发送数据: 发送数据使用DatagramSocket的send()方法,需要向括号中传入一个数据包参数DatagramPacket,

发送数据首先需定义要发送的内容,然后存以字节数组,使用DatagramPacket数据包存储数据。 注意,在存入数据时需指定服务端的IP地址InetAddress,及端口号,而且IP地址需要通过创建一个InetAdress对象来传入,并且调用其getBuName()方法,括号里写IP地址。

第三部分:服务端接收数据后向客户端发数据

发数据同样使用DatagramSocket的send()方法;

不过和上述方法不同的是,在创建数据包时需要传入一个socketAddress地址,这个地址包含客户端的IP地址及端口号。

所以在这之前需要使用DatagramPacket的getSocketAdress()方法获取该对象,其余内容就和客户端发送数据相似了。

第四部分:客户端接收服务端数据

这部分内容和服务端接收数据时步骤完全一样,如下图所示,可以和之前代码对比一下,其中只有参数发生改变。

总结: 以上就是我对UDP网络通信的全部叙述了,大家可以通过客户端和服务端传输和发送数据的不同来对比学习,其中接收数据都是使用同样的方法,区别主要在于发送数据方式的不同;

其中客户端发送数据时获取服务端地址是通过InetAdress类的getByName()方法; 注意:获取的是IP地址,需在建数据包时加入端口号。

而服务端向客户端发数据时获取其地址是通过数据包DatagramPacket的getSocketAdress方法获取; 注意:获取的是IP地址和端口号,建数据包时不需指定端口号。

创作不易,希望大家可以关注博主,博主会持续更新Java相关的知识学习…