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

1.UDP是無鏈接到不可靠的一種傳輸方式,只負責發送而無論接收方是否接收到,因此效率也高一點(犧牲安全追求效率案例)數據庫

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

 

//客戶端類安全

public class Client{服務器

  //先拋異常,抓重點多線程

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

    //創建發送端線程

    DatagramSocket client=nwe DatagramSocket();代理

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

    //包內有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

  //完結撒花

相關文章
相關標籤/搜索