UDP的实现
Java中实现UDP协议的两个类,分别是DatagramPacket数据包类以及DatagramSocket套接字类。
其与TCP协议实现不同的是:
UDP的套接字DatagramSocket相比于Socket、ServerSocket来说,是一个非常简单的概念,没有连接的含义。套接字只需要知道侦听和发送数据包的本地端口即可。
也就是在TCP协议中庸Socket类和ServerSocket类进行功能划分,UDP协议中只用一个数据包套接字DatagramSocket发送和接受数据即可。
发送和接收数据、地址和端口都封装在数据包类DatagramPacket中。
DatagramPacket类
构造函数:
public DatagramPacket(byte[] buf,int length); /*offset为buf缓冲区的偏移量*/ public DatagramPacket(byte[] buf,int offset,int length); /*address表示目的地址 port表示目的端口*/ public DatagramPacket(byte[] buf,int offset,int length,InetAdress address, int port)
常用方法:
/*返回接受数据包的主机IP地址,通常用于获取接受到数据包的发送主机IP*/ public InetAdress getAdress(); /*返回数据包的主机端口号*/ public int getPort(); /*返回被接收或发送的缓冲区数据*/ public byte[] getData(); /*设置返回发出数据包的主机IP地址*/ public void setAdress(InetAdress iaddr); /*设置要将此数据包发往远程主机上的端口号*/ public void setPort(int iport);
DatagramSocket类
对于数据包套接字DatagramSocket来说,它只是发送或接收数据包的端口,不需要考虑链接。因此在客户端和服务器端都需要建立一个DatagramSocket对象,然后通过receive()方法接受数据包,通过send()方法发送数据包。
端口相关对照
UDP网络应用实例
客户端发送1-26数字给服务器端;
服务器端返回对应的A-Z给客户端。
客户端程序:
package web; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.util.Scanner; public class UDPCilent { public static void main(String[] args) { try { /*UDP Cilent SEND*/ DatagramSocket socket=new DatagramSocket(); System.out.println("UDP Cilent Start..."); System.out.println("Enter 1 to 26 ,Server Will Return U A to Z:"); String info=new Scanner(System.in).next(); socket.send(new DatagramPacket(info.getBytes(), info.length(),InetAddress.getByName("127.0.0.1"),3000)); System.out.println("UDP Cilent Send Message..."); byte[] rec=new byte[1024]; DatagramPacket recivepacket=new DatagramPacket(rec, rec.length); socket.receive(recivepacket); System.out.println("Receive"); String reciveData=new String(recivepacket.getData(),0,recivepacket.getLength()); System.out.println("Receive from"+recivepacket.getAddress().getHostAddress()+":"+reciveData); socket.close(); System.out.println("UDP Cilent close..."); } catch (Exception e) { // TODO: handle exception } } }
服务端程序
package web; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.Socket; public class UDPServer { public static void main(String[] args) { try { /*UDP Receive Message*/ DatagramSocket socket=new DatagramSocket(3000); byte []bf=new byte[1024]; DatagramPacket packet=new DatagramPacket(bf, 1024); System.out.println("UDP Server Start... Wait to Receive Message..."); socket.receive(packet); String info=new String(packet.getData(),0,packet.getLength())+"from"+packet.getAddress().getHostAddress()+":"+packet.getPort(); System.out.println(info); /*feedback*/ InetAddress address= packet.getAddress(); int port=packet.getPort(); String str=new String(packet.getData(),0,packet.getLength()); int renum=Integer.parseInt(str); int feedback='A'; for(int i=1;i<=26;i++) { if(renum==i){ feedback=feedback+(i-1); } } char back=(char) feedback; String fbString=back+""; byte[] fstr=fbString.getBytes(); DatagramPacket feed= new DatagramPacket(fstr,fstr.length,address,port); socket.send(feed); socket.close(); System.out.println("UDP Server close..."); } catch (Exception e) { // TODO: handle exception } } }