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