UDP

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);
    

    } }}
相關文章
相關標籤/搜索