发送端 应用A,指定端口号为10000,ip地址为本地地址:
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
public class Demo2 {
public static void main(String[] args) throws IOException {
/*
* 创建UDP传输的发送端 发送快递
* 1.建立一个UDP的socket服务 先建立快递点
* 2.将要发送的数据封装到数据包中 将寄的快递封装到袋子中
* 3.通过UDP的scocket服务将数据包发送出去
* 4.关闭socket服务,释放资源
*/
//1.建立UDP服务 DatagramSocket
//发送端 应用A,端口号为10000,ip为本地地址
//指定端口号的构造函数
DatagramSocket ds=new DatagramSocket(10000);
//2.数据打包
String str="哥们来了...";
//由于DatagramPocket对象处理的都是byte类型的。所以需要将字符串转换为byte
byte[] buf=str.getBytes();
//buf: byte数组
//offset:偏移量
//length:数组的长度
//address:对方的ip地址,要发送给谁(这里发送给自己)
//port:发送的端口号
DatagramPacket dp=new DatagramPacket(buf, 0, buf.length, InetAddress.getLocalHost(), 10001);
//3.发送出去
ds.send(dp);//此时可能会报IO异常
//4.关闭服务
ds.close();
}
}
接收端 应用B,指定端口号为10001,ip地址同样采用本地地址(所以应用A与应用B在同一地址内)
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class Demo3 {
public static void main(String[] args) throws IOException {
/*
* 建立UDP接收端的思路 取快递
* 1.建立UDP的socket服务 快递点
* 2.创建数据包,用于存储接收的数据 拿个袋子用于装快递
* 3.使用SOCKET的receive方法将接收的数据存储到数据包中 装入袋子中
* 4.通过数据包中的方法解析数据包中的数据 拆开袋子
* 5.关闭资源
*/
//1.建立UDP socket服务
//接收端 应用B,端口号为10001,ip为本地地址,与应用A在同一地址中
DatagramSocket ds=new DatagramSocket(10001);
//2.创建数据包
byte[] buf=new byte[1024];//指定创建的数据包的大小
DatagramPacket dp=new DatagramPacket(buf, buf.length);
//3.使用接收方法接收数据放入数据包中
//receive为阻塞式方法。如果没有收到东西则会一直等待,所以先运行接收端,让它等待,在运行发送端,让它发送数据
ds.receive(dp);//将接受得到的数据包存到dp数据包中
//4.解析数据包中的信息
String ip=dp.getAddress().getHostAddress();//到底是谁发过来的
int port=dp.getPort();//从哪个端口号发过来的
byte[] b=dp.getData();//将数据包中的数据取出放到b数组中
String str=new String(b, 0, b.length);
System.out.println(ip+"..."+port);
System.out.println(str);
//5.关闭资源
ds.close();
}
}
需要注意的问题:
receive为阻塞式方法。如果没有收到东西则会一直等待,所以先运行接收端,让它等待,再运行发送端,让它发送数据。
运行结果为: