package datagarm;
import java.io.*;
import java.net.*;
public class DategramSend //UDP发送端
{
//UDP是无连接的传输方式(它不管接收端存不存在,不管接收端有没有收到发送的数据)
//UDP速度快,但容易丢包。
//一般丢失一点东西也不影响使用的情况会用UDP:视频电话,有线电视啥的用UDP
//比较重要的东西,或者下载文件(丢失数据会打不开),用TCP
//数据报套接字相当于家,数据报包相当于快递,在发送快递时,重要的是在快递上(DatagramPacket)写上地址(IP和端口号)
public static void main(String[] args) throws IOException {
DatagramSocket ds=new DatagramSocket();//创建数据报套接字对象,默认构造方法会默认给定一个端口号(没啥用)
byte[] b="Hello UDP".getBytes();
InetAddress ip=InetAddress.getByName("127.0.0.1");//这个IP为本机IP(适用于所有电脑)
//第一个参数为字节数组,第二个参数为字节数组的长度(这里写字符串长度不靠谱,因为一个中文是一个字符但是两个字节)
//第三个参数是InetAddress对象,它表示你要发送给的那个人的IP,第四个参数为端口号,表示你发送给的那个人的端口号
DatagramPacket dp=new DatagramPacket(b,b.length,ip,6666);
ds.send(dp);//将数据报包发送出去
ds.close();//关闭流
}
}
package datagarm;
import java.net.*;
import java.io.*;
public class DategramReceive //UDP的接收端
{
public static void main(String[] args) throws IOException {
DatagramSocket ds=new DatagramSocket(6666);//指定端口号(告诉快递送到哪里,IP不用指定,因为发送的数据已经达到你的电脑上了)
byte[] b=new byte[1024*64];//一个字节数为64K的数组,因为不知道传过来的数据有多大所以尽量开大
DatagramPacket dp=new DatagramPacket(b,b.length);//第一个参数是字符数组,第二个参数是存多少个该数组中的元素到数据报包中
ds.receive(dp);//把接收到的数据存到数据报包里,其实是存在数据报包的数组里,receive会永远等待,直到接收到发送过来的数据
System.out.println(new String(b,0,dp.getLength()));//new一个String对象,把字节数组转化为字符串,第一个参数是字节数组
//第二个参数是从这个字节数组哪里开始,第三个参数表示取多少个字节。这里dp.getLength()返回的是接收到的数据的真实长度
System.out.println(dp.getAddress().getHostAddress());//dp.getAddress()返回InetAddress对象,这个对象是发送端IP对应的
}
}