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
//完結撒花