Java UDP的簡單例項以及知識點簡述
阿新 • • 發佈:2019-02-10
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 } } }