目录
前言
工作中遇到UDP数据的接收与发送工具类,记录下以便后续有需要使用。
一、udp是什么?
UDP是一个无连接协议,传输数据之前源端和终端不建立连接,当它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。在发送端,UDP传送数据的速度仅仅是受应用程序生成数据的速度、计算机的能力和传输带宽的限制;在接收端,UDP把每个消息段放在队列中,应用程序每次从队列中读一个消息段。
由于传输数据不建立连接,因此也就不需要维护连接状态,包括收发状态等,因此一台服务机可同时向多个客户机传输相同的消息。注意:UDP协议是不可靠的。
二、使用步骤
1.UDP接收工具类
代码如下:
package com.datafactory.utils;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
/**
* udp接受工具类
*/
public class UDPRev {
private DatagramSocket server;
private DatagramPacket packet;
private byte[] b;
/**
* @Description 构造接收udp的同时设置接收端口号
* @param: revPort
* @return null
* @throws
**/
public UDPRev(int revPort){
super();
try {
this.server = new DatagramSocket(revPort);
} catch (SocketException e) {
e.printStackTrace();
}
System.out.println("UDP接收已启动,正在监听端口"+revPort);
}
//持续接收udp端口发送过来的数据
public byte[] receiveData(){
b = new byte[1024];
int len=0;
packet = new DatagramPacket(b,b.length);
try {
server.receive(packet);
} catch (IOException e) {
e.printStackTrace();
}
return packet.getData();
}
}
2.UDP发送工具类
代码如下:
package com.datafactory.utils;
import java.net.*;
/**
* udp发送工具类 每次发送都需要重新创建一个发送udp的对象
*/
public class UDPSend {
/**
* 发送端口
*/
private int sendPort;
/**
* 发送ip
*/
private String sendIP;
/**
* 发送使用的客户端对象
**/
private DatagramSocket client;
//创建发送端Socket对象
public UDPSend(int sendPort,String sendIP){
super();
this.sendPort = sendPort;
this.sendIP = sendIP;
try {
client = new DatagramSocket(sendPort);
} catch (SocketException e) {
e.printStackTrace();
}
System.out.println("UDP发送端已启动,发送端口:"+sendPort+",发送ip:"+sendIP);
}
//发送数据包
public void send(byte[] sendMessage){
//创建数据并打包
int length = sendMessage.length;
try {
InetAddress ip = InetAddress.getByName(sendIP);
//根据自己主机的ip地址或者主机名
DatagramPacket dp = new DatagramPacket(sendMessage,length,ip,sendPort);
//发送数据
client.send(dp);
}catch (Exception e){
e.printStackTrace();
}
}
}
3.UDP发送接收调用示例
持续接收UDP数据代码如下:
UDPRev udpRev = new UDPRev(6000);
while(true){
//接受udp数据
byte[] udpData = udpRev.receiveData();
//将接收到的数据做处理
}
发送UDP数据代码如下:
byte[] udpData = new String("123456").getBytes();
UDPSend udpSend = new UDPSend(6001,"192.168.0.1");
udpSend.send(udpData);
总结
UDP的接收需要持续不断的接收,每个接收端口都需要重新创建一个接收UDP工具类对象对数据进行接收,不可以重复使用对象。
UDP发送时也一样,发送到不同的端口时需要创建新的发送工具类对象。