UDP通信原理
是一种不牢靠的网络协议,只管发送,不论对方是否接管到
UDP发送数据
发送数据步骤
UDP协定是用户数据报协定
- 创立发送端的Socket对象(DatagramSocket) DatagramSocket()
- 创立数据,并把数据打包 DatagramPacket(byte[] buf,int length,InetAddress address,int port)
- 调用DatagramSocket对象的办法发送数据 void send(DatagramPacket p)
敞开发送端 void close()
发送数据程序//创立发送端的Socket对象//DatagramSocket()结构数据报套接字并将其绑定到本地主机上的任何可用端口DatagramSocket ds = new DatagramSocket();//alt enter 抛出异样//创立数据,并把数据打包//DatagramPacket(byte[] buf,int length,InetAddress address,int port) //结构一个数据包,发送长度为length的数据包到指定主机上的指定端口号byte[] bys = "hello,udp,我来了".getBytes();int length = bys.length;InetAddress address = InetAddress.getByName("192.168.1.66"); //alt enter 抛出异样int port = 10086;//创立数据包DatagramPacket dp = new DatagramPacket(bys,length,address ,port);//下面的几行代码能够优化为DatagramPacket dp = new DatagramPacket(bys,bys.length,InetAddress.getByName("192.168.1.66"),port:10086);//调用DatagramSocket对象的办法发送数据//send(DatagramPacket p) 从此套接字发送数据报包ds.send(dp);//敞开发送端//void close() 敞开数据报套接字ds.close();
UDP接收数据
接收数据步骤
- 创立接收端的Socket对象(DatagramSocket) DatagramSocket(int port)
- 创立一个数据包,用于接收数据 DatagramPacket(byte[] buf,int length)
- 调用DatagramSocket对象的办法接收数据,把数据接管到数据包中 void receive(DatagramPacket p)
- 解析数据包,并把数据在控制台显示 byte[] getData() int getLength()
敞开接收端 void close()
接收数据程序//创立接收端的Socket对象用带参构造方法,指定一个端口//DatagramSocket(int port)结构数据报套接字并将其绑定到本地主机上的指定端口DatagramSocket ds = new DatagramSocket(port:10086);//alt enter 抛出异样//创立一个数据包,用于接收数据 //DatagramPacket(byte[] buf,int length) //结构一个DatagramPacket,用于接管长度为length的数据包byte[] bys = new byte[1024];//创立数据包DatagramPacket dp = new DatagramPacket(bys,bys.length);//调用DatagramSocket对象的办法接收数据,把数据接管到数据包中ds.receive(dp);//解析数据包,并把数据在控制台显示//byte[] getData() 返回数据缓冲区byte[] datas = dp.getData();//这个是数据缓冲区//int getLength() 返回要发送的数据的长度或者接管到的数据的长度int len = dp.getLength();//拿到的是理论发送了多少数据String dataString = new String(datas,offset:0,len);sout("数据是:"+dataString);//下面两行优化sout("数据是:"+new String(dp.getData(),offset:0,dp.getLength()));//敞开发送端//void close() 敞开数据报套接字ds.close();
UDP通信程序练习
发送数据程序
//创立发送端的Socket对象DatagramSocket ds = new DatagramSocket();//alt enter 抛出异样//本人封装键盘录入数据BufferedReader br = BufferedReader(new InputStreamReader(System.in));String line;while((line=br.readLine())!=null){//alt enter 抛出异样 //所输出的数据是886,发送数据完结 if("886".equals(line)){ break; } //如果不是,就创立数据,并把数据打包 byte[] bys = line.getBytes(); //创立数据包 DatagramPacket dp = new DatagramPacket(bys,length,InetAddress.getByName("192.168.1.66"),port:12345); //调用DatagramSocket对象的办法发送数据 ds.send(dp);}//敞开发送端ds.close();
接收数据程序
//创立接收端的Socket对象用带参构造方法,指定一个端口DatagramSocket ds = new DatagramSocket(port:12345);//alt enter 抛出异样while(true){//死循环接管 //创立一个数据包,用于接收数据 //DatagramPacket(byte[] buf,int length) //结构一个DatagramPacket,用于接管长度为length的数据包 byte[] bys = new byte[1024]; //创立数据包 DatagramPacket dp = new DatagramPacket(bys,bys.length); //调用DatagramSocket对象的办法接收数据,把数据接管到数据包中 ds.receive(dp);//alt enter 抛出异样 //解析数据包,并把数据在控制台显示 sout("数据是:"+new String(dp.getData(),offset:0,dp.getLength()));}//敞开发送端ds.close();}