使用UDP實現數據的發送和接收


1.UDP是無連接到不可靠的一種傳輸方式,只負責發送而不管接收方是否接收到,所以效率也高一點(犧牲安全追求效率案例)

2.實現發送和接收的具體實現

 

//客戶端類

public class Client{

  //先拋異常,抓重點

  public static void main (String []args)throws Exception{

    //建立發送端

    DatagramSocket client=nwe DatagramSocket();

    //數據都是通過"包"來發送的

    //包內有4個參數,byte數組 數組長度 發送地址 發送的端口號

    //計算機很呆,必須要告訴它發什么,發給誰,想象成寫信(email),如上圖,我們寫完正文再寫地址,文章就發送過去了

    //通過String類的getByte()方法把字符串變成byte數組(這里可以用Scanner來手動輸入內容,有互動性更有趣)

    byte[] buf="內容".getByte();

    int length=buf.length;

    //取得本機的地址(因為是自己發給自己),也可以改成別的你知道的數據庫的ip地址,至於它能不能收到就不好說了,畢竟這是一種不可靠的傳輸

    InetAddress ia=InetAddress.getByName("localhost");

    //這個隨便寫,但是盡量不要寫三位數,容易和其他軟件產生沖突

    int port=5678;

    //打包准備發貨

    DatagramPacket dp=new DatagramPacket(buf,length,ia,port);

    //發貨

    client.send(dp);

    //可以輸出一句提示語,表示發貨了

    System.out.println("數據已經發送了");

    //記得關門~

    client.close();

  }

}

 

//服務器類(不要把服務器類和客戶端寫在一起)

  public class Server{

    //抓主要,直接拋異常

    public static void main (String[]args)throws Exception{

      //這是服務器端,要提前聲明好端口,因為要先開啟,必須先搶占一個地盤

      //由於我們先寫客戶端,為了保持一致,所以端口號也是5678(雖然看起來是先有客戶端5678,但根源是先有服務器的5678)

      int port=5678;

      DatagramSocket server=new DatagramSocket(port);

      //發送端送來的是個"包裹",咱們也得用包裹去接,用多大的包裹呢,一般情況下1024個字節就夠了吧,在客戶端我們做一點限制防止裝不下導致數據丟失

      //(微博的140字限制)  結合現實,我們只需要接收方的包裹給2個數據(數組,及數組長度即可).

      byte[]buf=new byte[1024];

      int length=buf.length;

      DatagramPacket dp=new DatagramPacket(buf,length);

      //准備好了,來接收吧

      server.receive(dp);

      //確認一下收到了啥玩意,得到dp的數據,從0薅到尾      

      String str=new String(dp.getData(),0,dp.length);

      //如果接收到了吱一聲

      System.out.println(str);

      //記得關門是個好習慣

      server.close();

  }

}

 以上就是UDP的單次傳輸方式

    

二 怎么多次才能使用呢?

  循環!那循環多少次呢?不知道?那就選while吧.

  怎么改呢,只要把客戶端服務器的代碼寫在while里面就可以了

  設置一個信號,如果不想循環了,就啟動信號,break出去.

  現實生活中服務器是不關的,可以不用寫close();

 

三.以上是一對一哎,咱們不可能專門為一個人寫一個服務器(土豪除外)

  於是用到了多線程

  回想一下創建線程有哪些方法啊?可以繼承Thread類,可以通過實現Runnable接口.

  那就隨便選一個吧,使用Runnable接口

  客戶端線程外面就長成這個樣子

  public class ClientThread implements Runnable{

    @override

    public void run(){

     //這里是線程執行的代碼,你希望這個線程做什么全往這招呼,於是我們不客氣的使用了CV大法,把之前寫的客戶端主體復制粘貼過來了

      ----------

     //不同的是這個host(端口)不要寫死,給大家一點自由,咋整啊...構造方法站了起來

     //於是把端口作為私有的屬性,給發一個公有地構造方法,當調用的時候就可以給端口設定值了 

    

    }

}

    //可以了,應該建一個Test類驗收一下了

   public class ServerTest{

    public static void main(String []args){

      //先建服務器端線程類對象

      ServerThread st=new ServerThread(5678);

      //由於它是實現Runnable接口,自己沒東西,所以要找代理

      Thread t=new Thread(ct);

      t.start();

      }

  }  

      //在建一個客戶發送端

 public class ClientTest{

    public static void main(String []args){

      //三行不好看,可以試着合為一句,好處是不用想名字了

      new Thread(new ServerThread(5678)).start();

      }

  }  

  //注意,寫在線程里的代碼是實現了Runnable接口,但是Runnable接口沒有拋異常,所以線程也不能在方法聲明處拋異常了,只能用try-catch自己寫異常了QAQ

  //其實也簡單,代碼全寫在try里,catch判斷異常類型,不會就寫Exception

  //完結撒花

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM