UDP是User Datagram Protocol的簡稱, 中文名是用戶數據報協議。是一種面向非鏈接通訊協議。java
其過程發送過程,與快遞員送快遞是相似的。假如快遞員須要送一個件,他必須先把物件(文件)打包,而後讓顧客填寫寄件地址(ip地址),那麼問題出現了。通常填寫寄件地址是一個學校或者學院,假設該寄件地址上有A、B、C三人。那麼快遞員就必需要顧客填寫收件人(假設A是收件人)的電話號碼,打電話聯繫A,確保將物件送到A手上。所以電話號碼就成了到達寄件地址後識別收件人的一個特徵,通信協議稱爲端口。android
相應的代碼建立步驟爲;數組
1.生成DatagramSocket對象,參數爲端口號;安全
DatagramSocket ds=new DatagramSocket(9999);app
2.建立一個InetAddress對象,用於肯定server客戶端(數據接收方),參數爲IP地址;socket
InetAddress serverAddress=InetAddress.getByName("192.168.31.52");ide
3.生成一個DatagramPacket對象,包含須要發送的byte數組,byte數組長度,已設置IPthis
地址的serverAddress,和服務端一致的端口號;
byte data[]=new byte[1024];spa
DatagramPacket dp = new DatagramPacket (data , data.length , serverAddress , 9999);.net
4.發送數據,調用DatagramSocket對象的send方法;
ds.send(dp);
其接受過程是,快遞員已經到了寄件地址,而後電話聯繫A,確認後(即確認端口)後把快遞給A。假設A拿着一個袋子取取快遞,A就把快遞放在包中,而後接收完畢。(備註,即便A沒有袋子,那麼也能夠將A當作一個袋子,由於A也只能拿走力所能及的物品,超除外就只能放棄)。
1.建立一個DatagramSocket對象,並指定監聽的端口號
DatagramSocket socket=;new DatagramSocket(6666)
2.建立一個byte數組(袋子)用於接收
byte data[]=new byte[1024];
3.建立一個空的DatagramPackage對象
DatagramPacket packet=new DatagramPacket(data,data.length);
4.使用receive方法接收發送方所發送的數據,同時這也是一個阻塞的方法
socket.receive(packet);
5.獲得發送過來的數據
String str=new String(packet.getData(), packet.getOffset() ,packet.getLength());
UDP相對於TCP來講,其安全性和可靠性是較弱的。由於該通訊方法依靠IP地址和端口號進行,沒有反饋效果。
假設顧客的寄件地址(IP地址)或端口號填寫錯誤了,則會發生丟包的狀況;
假設收件人已經收到到快遞,快遞員沒有反饋給顧客,那麼顧客就會從新郵件一份過去。
故此編寫UDP時須要在控制程序上編寫反饋。UDP主要用於告訴傳輸和實時性要求較高的通訊和廣播通訊上。
發送端的代碼:
package com.example.udpdemo; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketException; import java.net.UnknownHostException; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.app.Activity; import android.util.Log; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; public class MainActivity extends Activity { DatagramSocket socket; //TextView receive_message; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //建立一個DatagramSocket對象 //建立一個 InetAddress , 至關因而地址 //這是隨意發送一個數據 // Button bt=(Button)this.findViewById(R.id.bt); final EditText et = (EditText)this.findViewById(R.id.et); //建立監聽器 bt.setOnClickListener(new OnClickListener(){ public void onClick(View v) { // TODO Auto-generated method stub new Thread(new Runnable(){ @Override public void run() { // TODO Auto-generated method stub Log.v("監聽", "發送成功!"); String msg=et.getText().toString(); try { sendMsg(msg); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }).start(); } }); } protected void sendMsg(String msg) throws Exception{ //建立一個DatagramSocket對象 //建立一個 InetAddress , 至關因而地址 //這是隨意發送一個數據 // //1.建立發送的套接字 DatagramSocket ds=new DatagramSocket(1234); //2.目標地址 InetAddress serverAddress=InetAddress.getByName("192.168.31.52"); //3.獲取發送的數據 byte[] data=msg.getBytes(); DatagramPacket dp = new DatagramPacket (data , data.length , serverAddress , 9999); //發 ds.send(dp); Log.v("fasong", "發送成功!"); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } }
接收端代碼:
package udp; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.SocketException; public class udpDemo { //1.建立一個DatagramSocket對象,並指定監聽的端口號 //2.建立一個byte數組用於接收 //3. 建立一個空的DatagramPackage對象 //4. 使用receive方法接收發送方所發送的數據,同時這也是一個阻塞的方法 //5.獲得發送過來的數據 public static void main(String [] args) throws Exception{ //建立了一個Socket DatagramSocket socket = new DatagramSocket(9999); while(true){ byte data[]=new byte[1024]; //建立一個空的datagramPackage DatagramPacket packet=new DatagramPacket(data,data.length); //接收發送方所發送的數據,同時這也是一種阻塞的方法 socket.receive(packet); String str=new String(packet.getData(), packet.getOffset() ,packet.getLength()); System.out.println("接收到的數據"+str); } }}