UDP协议全称是用户数据报协议,在网络中它与TCP协议一样用于处理数据包,是一种无连接的协议。在OSI模型中,在第四层——传输层,处于IP协议的上一层。UDP有不提供数据包分组、组装和不能对数据包进行排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。UDP用来支持那些需要在计算机之间传输数据的网络应用。包括网络视频会议系统在内的众多的客户/服务器模式的网络应用都需要使用UDP协议。UDP协议从问世至今已经被使用了很多年,虽然其最初的光彩已经被一些类似协议所掩盖,但是即使是在今天UDP仍然不失为一项非常实用和可行的网络传输层协议。
UDP传输:
DatagramSocket:此类用来发送和接收数据报包的套接字。
DatagramPacket:此类表示数据报包。数据报包用来实现无连接包投递服务。每条报文仅根据该包中包含的信息从一台机器路由到另一台机器。从一台机器发送到另一台机器的多个包可能选择不同的路由,也可能按不同的顺序到达。不对包投递做出保证。
示:用于发送
public static void send() throws Exception{
DatagramSocket ds = new DatagramSocket();//创建<span style="font-family: arial, 宋体, sans-serif; font-size: 14px; line-height: 24px; text-indent: 28px;">套接字对象</span>
byte[] data = "udp haha".getBytes();//用于发送的数据
DatagramPacket dp = new DatagramPacket(data, data.length, InetAddress.getLocalHost(), 10000);//向本机的10000端口发送
ds.send(dp);//发送
ds.close();//关闭资源
}
示:用于接收
public static void reciever() throws Exception {
<span style="white-space:pre"> </span>DatagramSocket ds = new DatagramSocket(10000);//创建套接字,并监听10000端口
byte[] buf = new byte[1024];//用于存放接收的数据
DatagramPacket dp = new DatagramPacket(buf, buf.length);//用于接收的数据报
ds.receive(dp);//阻塞方法
InetAddress address = dp.getAddress();
System.out.println(address.getHostAddress());
int port = dp.getPort();
System.out.println(port);
byte[] data = dp.getData();
System.out.println(new String(data,0,dp.getLength()));
}
简单例子:
package UDP;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
public class ChatDemo {
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
new Thread(new Rece(new DatagramSocket(10000))).start();
new Thread(new Send(new DatagramSocket())).start();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
class Rece implements Runnable {
private DatagramSocket ds;
public Rece(DatagramSocket ds) {
this.ds = ds;
}
@Override
public void run() {
// TODO Auto-generated method stub
while (true) {
byte[] b = new byte[1024];
DatagramPacket p = new DatagramPacket(b, b.length);
try {
ds.receive(p);
System.out.println(p.getAddress().getHostAddress() + "::"
+ new String(p.getData(), 0, p.getLength()));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
class Send implements Runnable {
private DatagramSocket ds;
public Send(DatagramSocket ds) {
this.ds = ds;
}
@Override
public void run() {
BufferedReader br = null;
try {
br = new BufferedReader(new InputStreamReader(System.in));
String line = "";
while ((line = br.readLine()) != null) {
if ("line".equals("886")) {
break;
}
byte[] b = line.getBytes();
DatagramPacket p = new DatagramPacket(b, b.length,
InetAddress.getByName("255.255.255.255"), 10000);
ds.send(p);
}
} catch (Exception e) {
// TODO: handle exception
throw new RuntimeException("发送错误");
} finally {
if (ds != null) {
ds.close();
}
}
}
}