UDP通信 1、DatagramPacket 前面介绍UDP是一种面向无连接的协议,因此,在通信时发送端和接收端不需要建立连接。UDP通信的过程就像是货运公司在两个码头之间发送货物一样。在码头发送和接收货物时都需要使用集装箱来装载货物,UDP通信也一样,发送和接收的数据也需要使用“集装箱”进行打包。为此JDK中提供了一个DatagramPacket类,该类的实例对象就相当于一个集装箱,用于封装UDP通信中发送或者接收的数据。 想要创建一个DatagramPacket对象,首先需要了解一下它的构造方法。在创建接收端和发送端的DatagramPacket对象时,使用的构造方法有所不同,接收端的构造方法只需要接收一个字节数组来存放接收到的数据,而发送端的构造方法不但要接收存放了发送数据的字节数组,还需要指定发送端IP地址和端口号。接下来了解一下DatagramPacket的构造方法。 DatagramPacket(byte[]buf,intlength) 使用该构造方法在创建DatagramPacket对象时,指定了封装数据的字节数组和数据的大小,没有指定IP地址和端口号。很明显,这样的对象只能用于接收端,不能用于发送端。因为发送端一定要明确指出数据的目的地(IP地址和端口号),而接收端不需要明确知道数据的来源,只需要接收数据即可。 DatagramPacket(byte[]buf,intlength,InetAddressaddr,intport) 使用该构造方法在创建DatagramPacket对象时,不仅指定了封装数据的字节数组和数据的大小,还指定了数据的目标IP和端口号。该对象常用于发送端,因为在发送数据时必须指定接收端的IP和端口号,就好像发送货物的集装箱上面必须标明接收人的地址一样。 DatagramPacket对象中常用的方法: InetAddressgetAddress()该方法用于返回发送端或者接收端的IP地址,如果是发送端的DatagramPacket对象就返回接收端的IP地址,反之,就返回发送端的IP地址。 intgetPort()该方法用于返回发送端或者接收端的端口号,如果是发送端的DatagramPacket对象,就返回接收端的端口号,反之,就返回发送端的端口号。 byte[]getData()该方法用于返回将要接收或者发送的数据,如果是发送端的DatagramPacket对象,就返回将要发送的数据,反之,就返回接收到的数据。 intgetLength()该方法用于返回接收或者发送数据的长度,如果是发送端的DatagramPacket对象,返回将要发送的数据的长度,反之,返回接收到数据的长度。 2、DatagramSocket DatagramPacket数据包的作用就如同是“集装箱”,可以将发送端或者接收端的数据封装起来。然而,运算货物只有集装箱是不够的,还需要有码头。在程序中要实现通信只有DatagramPacket数据包也同样不行,为此JDK提供了一个DatagramSocket类。DatagramSocket类的作用类似于码头,使用这个类的实例对象就可以发送和接收DatagramPacket数据包,其构造方法有: DatagramSocket()该构造方法用于创建发送端的DatagramSocket对象,在创建DatagramSocket对象时,并没有指定端口号,这时,系统会随机分配一个没有被其他网络程序所使用的端口号。 DatagramSocke(intport)该构造方法即可用于接收端的DatagramSocket对象,又可以创建发送端的DatagramSocket对象,在创建接收端的DatagramSocket对象时,必须要指定一个端口号,这样就可以监听一个端口。 DatagramSocket(intport,InetAddressaddr)该构造方法在创建DatagramSocket时,不仅指定了端口号,还指定了IP地址,这种情况适用于计算机上有多块网卡的情况,可以明确的规定数据通过那块网卡向外发送和接收数据。由于计算机中针对不同的网卡会分配不同的IP,因此在建立DatagramSocket对象是需要通过指定IP来确定使用那块网卡进行通信。 DatagramSocket的常用方法有: voidreceive(DatagramPacketp)该方法用于将接收到的数据填充到DatagramPacket数据包中,在接收到数据之前会一直处于阻塞状态,只有接收到数据包时,该方法才会返回。 voidsend(DatagramPacketp)该方法用于发送DatagramPacket数据包,发送的数据包中包含将要发送的数据、数据长度、远程主机IP地址和端口号。 voidclose()关闭当前的Socket,通知驱动程序释放这个Socket保留的资源。 3、UDP网络程序 3.1、发送端程序 importjava.net.*; publicclasssend{ /** *思路: *发送端建立步骤 *1、建立Socket服务 *2、确定发送数据,并封包 *3、用send()发送 *4、关闭资源 */ publicstaticvoidmain(String[]args)throwsException{ //1、建立UDP服务 DatagramSocketds=newDatagramSocket(); //确定发送数据,并打包 byte[]buf=我是一号.getBytes(); DatagramPacketdp= newDatagramPacket(buf,buf.length,InetAddress.getLocalHost(),); //3、发送数据 ds.send(dp); //关闭资源 ds.close(); } } 3.2、接收端程序 importjava.net.*; publicclassExample3{ /** *建立接收端 *1、建立接收端Socket服务 *2、建立存储的数据包 *3、用Socket的receive方法接收数据 *4、用Socket的方法解析数据 *5、关闭资源 */ publicstaticvoidmain(String[]args)throwsException{ //1、建立接收端的Socekt服务 DatagramSocketds=newDatagramSocket(); //2、建立存储数据包服务 byte[]buf=newbyte[]; DatagramPacketdp=newDatagramPacket(buf,buf.length); //3、接收数据存储到dp中 ds.receive(dp); //用dp的特有方法解析数据 InetAddressip=dp.getAddress(); intlen=dp.getLength(); Stringdata=newString(dp.getData(),0,len); intport=dp.getPort(); System.out.println(ip+::+data+::+port); } } 演示效果: 温馨提示: 更多精彩内容请中科医院曝光北京哪家治疗白癜风医院最好
|