簡單的UDP網絡編程

   說是原創,其實確實是擡舉我了,我是看了張孝祥老師的視頻後纔會的,但是確實是我獨立做出的,盜用別人的代碼是可恥,但是能借鑑別人的思想,確實對自己有所幫助,我也因此受益匪淺。好,廢話不多說,進入正題。


   Socket網絡編程有2種,tcp,udp,一般人可能tcp聽的比較多,用的也比較多,而對udp確不是很瞭解,那麼我來說下,udp(user datagram protocol)翻譯過來就是用戶數據報協議。

我想說的是tcp和udp的區別,tcp需要先寫一個服務器類,再寫一個客戶端類,服務器類中new 一個ServerSocket,然後用accept()方法與連接過來的Socket建立連接。但是udp是不建立連接的,udp自己管自己忘目的地發送一個DatagramPacket,他不管你有沒接收,他發好他就完成任務了。udp編程你要寫個發送的類,寫 一個接收的類,並且在運行時,要先運行接收的類,不然發送的類發送完東西就結束了,你還一直在接收,這就沒必要了吧。


     說了這麼多,大家肯定煩了,尼瑪代碼怎麼寫啊不知道,講了一堆廢話,好,那麼直接說怎麼寫代碼吧(不喜勿噴,不喜勿噴,謝謝各位看官了。)


   UdpSend:

public class UdpSend {

public static void main(String[] args) {

try {

DatagramSocket ds=new DatagramSocket();

/*上面一行爲什麼不加端口號呢呢,這可大有來頭


 當你new 一個DatagramSocket對象沒給參數時,系統會默認給一個沒用過的端口號。  

   這樣你就不用擔心用到了系統正在用的端口號了,當然你給他 也不算你錯啦


來個比較經典的例子:你給別人打電話,你需要知道自己的電話號碼嘛?

可能還是有人不是很清楚,沒關係,因爲我當時一看也沒怎麼理解,先看下面代碼

*/

DatagramPacket dp=new DatagramPacket("ni hao !".getBytes(),"ni hao !".length(),InetAddress.getByName("localhost"),3333);

/*

這裏又可以舉個例子:你給別人打電話,你是不是要知道別人的電話號碼

這裏的電話號碼在代碼裏的體現就是IP地址和port端口號

*/

ds.send(dp);

ds.close();

} catch (SocketException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (UnknownHostException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}


UdpReceive:


public class UdpReceive {

public static void main(String[] args) {

try {

DatagramSocket ds=new DatagramSocket(3333);

/*

再舉例子:你要別人給你打電話,你是不是要告訴別人你的電話號碼,不然別人怎麼給你打

*/

byte[] buf=new byte[1024];

DatagramPacket dp=new DatagramPacket(buf,buf.length);

/*

udpSend裏面的DatagramPacket帶了4個參數呢,這裏爲什麼只有2個參數

舉個例子:你接電話的時候你要知道對方的電話號碼,你才能接嘛?不是的,你不用知道,你可以接,至於接不接我們姑且先不討論,現在討論的是,你能不能接到?能。


在代碼裏的意思就是說,我不管你是從哪裏發過來的消息,我不需要知道你的IP你的端口,我都可以接到,至於程序員用不用這個消息,那就由他了。

*/

ds.receive(dp);

ds.close();

System.out.println(new String(buf,0,dp.getLength()));

} catch (SocketException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}


解釋了4行最關鍵的代碼,只要你能理解這四行,那麼差不多就能理解udp編程了,當然這只是入門而已,想要精通就上網找更多的例子。


希望對大家有幫助。


哦 對了,再說一點,上面傳輸的是不是英文的字符串啊,那麼如果傳輸中文的呢?


沒錯,報錯是不會報錯,可是不能正確傳輸,爲什麼呢 爲什麼呢??


因爲中文是2個字節的嘛,所以你不能用字符串長度代表數組長度了,。。懂了木有?不有的話,可以問我,我非常樂意解答,雖然我是菜鳥,可是大家不要嫌棄我哈。。。

       

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章