UDP的特点
1、将数据及源和目的封装为数据包,不需要建立连接
2、每个包数据的大小限制为64k
3、因为无连接,所以是不可靠的协议
4、不需要建立连接速度快
UDP的应用
qq聊天、网络视频。
udp简单演示
示例1
udp的接收端
<span style="font-size:18px;"><span style="font-size:18px;">import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
class UDP_Rece_Demo01 {
<span style="color:#33cc00;">/**
* 定义一个应用程序,用于接受udp协议传输的数据并处理
*
* 思路:
* 1、定义udpsocket服务,通常会监听一个端口,其实就是给这个接受网咯应用程序定义一个数字标识
* 方便于明确哪些数据过来该应用程序可以处理
* 2、定义一个数据包,因为要存储接受到的字节数据,
* 因为数据包种有更多的功能提取字节数据中的不同数据信息
* 3、通过socket服务的receive方法将收到的数据存入已定义好的数据包中
* 4、通过数据包中的特有功能,将不同的数据取出,打印在控制台上
* 5、关闭资源
* @throws IOException
*/</span>
public static void main(String[] args) throws IOException {
<span style="color:#33cc00;">//第一步:创建udp socket,建立端点</span>
DatagramSocket ds=new DatagramSocket(10000);<span style="color:#33cc00;">//指定监听端口</span>
<span style="color:#009900;">//2、定义数据包,用于存储数据。</span>
byte [] b=new byte[1024];
DatagramPacket dp=new DatagramPacket(b,b.length);
<span style="color:#009900;">//3、通过服务的receive方法将接受到的数据存入到数据包中</span>
ds.receive(dp);
<span style="color:#33cc00;">//4、通过数据包的方法获取其中的数据</span>
String ip=dp.getAddress().getHostAddress();
String data=new String(dp.getData(),0,dp.getLength());
int port=dp.getPort();
System.out.println(ip+"---"+data+"----"+port);
<span style="color:#33cc00;">//5、关闭资源</span>
ds.close();
}
}</span></span>
udp的发送端
<span style="font-size:18px;"><span style="font-size:18px;">import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
<span style="color:#33cc00;">/**
* 需求,通过udp传输方式,将一段文字数据发送出去
* 思路 1、建立udpSocket服务 2、提供数据,并将数据封装到数据包中去
* 3、通过Socket服务的发送功能,将数据包发送出去 4、关闭资源
*/</span>
public class UDP_Send_Demo01 {
public static void main(String[] args) throws Exception {
<span style="color:#33cc00;">// 1、创建udp服务,通过DaragramSocket对象</span>
DatagramSocket ds = new DatagramSocket(8888);<span style="color:#33cc00;">// 指定发送端口</span>
<span style="color:#009900;">// 2、确定数据,并封装成数据包</span>,
byte[] buf = "今天十很好的天气".getBytes();<span style="color:#33cc00;">// 数据</span>
DatagramPacket dp = new DatagramPacket(buf, buf.length,
InetAddress.getByName("10.144.243.11"), 10000);
<span style="color:#33cc00;">// 参数一:数据,参数二:数据长度,参数三:指定目的地的ip地址,参数四:端口号</span>
<span style="color:#33cc00;">// 3、通过socket服务,建议有的数据包发送出去,通过send()方法</span>
ds.send(dp);
<span style="color:#33cc00;">// 4、关闭资源</span>
ds.close();
}
}</span></span>
示例2
udp发送端
<span style="font-size:18px;"><span style="font-size:18px;">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 UDP_Send_Demo02 {
<span style="color:#33cc00;">
/**
* udp发送端02
*
* @throws IOException
*/</span>
public static void main(String[] args) throws IOException {
DatagramSocket ds = new DatagramSocket();
BufferedReader bReader = new BufferedReader(new InputStreamReader(
System.in));
String s = null;
while ((s = bReader.readLine()) != null) {<span style="color:#33cc00;">//循环输入数据发送给接收端当输入over时结束</span>
if ("over".equals(s)) {
break;
}
<span style="color:#33cc00;">// 将字符串转换为字节数组</span>
byte[] buf = s.getBytes();
DatagramPacket dp = new DatagramPacket(buf, buf.length,
InetAddress.getByName("10.144.243.11"), 10002);
ds.send(dp);
}
ds.close();
}
}</span></span>
udp的接收端
<span style="font-size:18px;"><span style="font-size:18px;">import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
<span style="color:#33cc00;">/**
* udp接受端02
*/</span>
public class UDP_Rece_Demo02 {
public static void main(String[] args) throws IOException {
DatagramSocket ds=new DatagramSocket(10002);
while (true) {<span style="color:#33cc00;">//循环接受发送端发过来的数据</span>
byte [] buf=new byte[1024];
DatagramPacket dp=new DatagramPacket(buf, buf.length);
ds.receive(dp);
String ip=dp.getAddress().getHostAddress();<span style="color:#009900;">//获取ip地址</span>
String data= new String(dp.getData(),0,dp.getLength()) ;
System.out.println(ip+"-------------"+data);
}
}
}</span></span>
示例3
udp练习
<span style="font-size:18px;"><span style="font-size:18px;">
package 网络编程;
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;
<span style="color:#33cc00;">/**
* 编写一个聊天小程序, 有接收数据的部分,和发送数据的部分
* 这两部分需要同时执行,就需要用到多线程技术
* 一个用来控制接受,一个用来控制发送
*/
</span>
<span style="color:#33cc00;">// 发送端</span>
class Send implements Runnable {
private DatagramSocket ds;//定义一个
public Send(DatagramSocket ds) {<span style="color:#33cc00;">//定义一个构造方法,一初始化,就必须传送一个DatagramSocket对象 </span>
this.ds = ds;
}
public void run() {
BufferedReader bReader = new BufferedReader(new InputStreamReader(
System.in));<span style="color:#33cc00;">//从键盘输入数据再将数据转换为字符流再加入字符流缓冲区</span>
String s = null;
try {
while ((s = bReader.readLine()) != null) {<span style="color:#33cc00;">//循环读取键盘数据</span>
if ("886".equals(s)) {
System.out.println("sdfs");
break;
}
DatagramPacket dp = new DatagramPacket(s.getBytes(),
s.length(), InetAddress.getByName("10.144.243.11"),
10002);
ds.send(dp);
}
bReader.close();
ds.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
<span style="color:#33cc00;">// 接收端</span>
class Rece implements Runnable {
private DatagramSocket ds;
public Rece(DatagramSocket ds) {
this.ds = ds;
}
public void run() {
while (true) {
try {
byte[] b = new byte[1024];
DatagramPacket dp = new DatagramPacket(b, b.length);
ds.receive(dp);
String ip = dp.getAddress().getHostAddress();
String data = new String(dp.getData(), 0, dp.getLength());
System.out.println(ip + "----------------" + data);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
public class UDP_Demo01 {
public static void main(String[] args) throws Exception {
DatagramSocket send = new DatagramSocket();
DatagramSocket rece = new DatagramSocket(10002);
<span style="color:#33cc00;">//同时开启两个线程
</span> new Thread(new Send(send)).start();
new Thread(new Rece(rece)).start();
}
}</span></span>