☆ UDP:
将数据及源和目的封装成数据包中,不需要建立连接
每个数据报的大小在限制在64k内
因无连接,是不可靠协议
不需要建立连接,速度快
DatagramSocket和
DatagramPacket类
UDP传输:
DatagramSocket与DatagramPacket
建立发送端,接收端。
建立数据包。
调用Socket的发送接收方法。
关闭Socket。
发送端与接收端是两个独立的运行程序。
UDP传输编程:
☆发送端
在发送端,要在数据包对象中明确目的地IP及端口。
DatagramSocket ds = new DatagramSocket(); byte[] by = “hello,udp”.getBytes(); DatagramPacket dp = new DatagramPacket(by,0,by.length, InetAddress.getByName(“127.0.0.1”),10000); ds.send(dp); ds.close();☆接收端
在接收端,要指定监听的端口。
DatagramSocket ds = new DatagramSocket(10000); byte[] by = new byte[1024]; DatagramPacket dp = new DatagramPacket(by,by.length); ds.receive(dp); String str = new String(dp.getData(),0,dp.getLength()); System.out.println(str+"--"+dp.getAddress()); ds.close();示例:
发送方:
package cn.hncu.url.udp; import java.io.BufferedInputStream; import java.io.FileInputStream; import java.io.InputStream; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketException; public class SendDemo { public static void main(String[] args) { try { // send1();//这个方法演示的是发送小数据 send2();//这个方法演示的是发送较大数据 } catch (Exception e) { e.printStackTrace(); } } private static void send2() throws Exception { //for sending larger packet DatagramSocket ds=new DatagramSocket(10000);//这里指定端口号10000,各程序上的端口号都是唯一的,一个程序中要新建多个DatagramSocket需要使用不同的端口号 InputStream in=new FileInputStream("file.txt"); BufferedInputStream bis=new BufferedInputStream(in); byte buf[]=new byte[1024]; buf[0]=0; int len=0; while ((len=bis.read(buf, 1, buf.length-1))!=-1){//这里我把数组第一位留出来作为判断文件是否读取完毕的标记 if (len<1023){ buf[0]=1;//文件读取完毕后位置0设为1,这样做是为了接收方的关闭动作,若不这样做的话不管是否读取完接收 //方会一直开着 } DatagramPacket dp=new DatagramPacket(buf, buf.length, InetAddress.getByName("xxx.xxx.xxx.xxx"), 10001); //上一行的ip地址我用xxx.xxx.xxx.xxx表示,运行程序时记得改成你自己的ip地址,下同 ds.send(dp); } ds.close(); } private static void send1() throws Exception { //for sending less packet DatagramSocket ds=new DatagramSocket(10000); String str="你知道吗,god is a girl"; byte buf[]=str.getBytes("utf-8"); //DatagramPacket类中,有ip地址的构造方法是用来创建发送数据包的 DatagramPacket dp=new DatagramPacket(buf, buf.length, InetAddress.getByName("xxx.xxx.xxx.xxx"),10001);//注意,IP和端口都是接收方的 ds.send(dp); ds.close(); } }接收方:
package cn.hncu.url.udp; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketException; public class ReceiveDemo { public static void main(String[] args) { try { // receive1();//接收小数据 receive2();//接收较大数据 } catch (Exception e) { e.printStackTrace(); } } private static void receive2() throws Exception { //for receiving larger packet DatagramSocket ds=new DatagramSocket(10001); byte buf[]=new byte[1024]; DatagramPacket dp=new DatagramPacket(buf, buf.length); while (true){ ds.receive(dp); //从dp中解析出我们想要的信息 //获取ip byte data[]=dp.getData(); String info=new String(data,1,data.length-1); System.out.println(info); if (data[0]==1){ ds.close(); } } } private static void receive1() throws Exception { //for receiving less packet DatagramSocket ds=new DatagramSocket(10001); byte buf[]=new byte[1024]; //DatagramPacket类中,没有ip地址的构造方法是用来创建接收数据包的 DatagramPacket dp=new DatagramPacket(buf, buf.length); ds.receive(dp); //从dp中解析出我们想要的信息 //获取ip String ip=dp.getAddress().getHostAddress(); int port=dp.getPort(); byte data[]=dp.getData(); String info=new String(data); System.out.println(ip+":"+port+"----"+info); } }