Java編程那些事兒105——網路編程技術4

來源:互聯網
上載者:User

13.2.4 UDP編程

網路通訊的方式除了TCP方式以外,還有一種實現的方式就是UDP方式。UDP(User Datagram Protocol),中文意思是使用者資料包通訊協定,方式類似於發簡訊息,是一種物美價廉的通訊方式,使用該種方式無需建立專用的虛擬串連,由於無需建立專用的串連,所以對於伺服器的壓力要比TCP小很多,所以也是一種常見的網路編程方式。但是使用該種方式最大的不足是傳輸不可靠,當然也不是說經常丟失,就像大家發簡訊息一樣,理論上存在收不到的可能,這種可能性可能是1%,反正比較小,但是由於這種可能的存在,所以平時我們都覺得重要的事情還是打個電話吧(類似TCP方式),一般的事情才發簡訊息(類似UDP方式)。網路編程中也是這樣,必須要求可靠傳輸的資訊一般使用TCP方式實現,一般的資料才使用UDP方式實現。

UDP方式的網路編程也在Java語言中獲得了良好的支援,由於其在傳輸資料的過程中不需要建立專用的串連等特點,所以在Java API中設計的實現結構和TCP方式不太一樣。當然,需要使用的類還是包含在java.net包中。

在Java API中,實現UDP方式的編程,包含用戶端網路編程和伺服器端網路編程,主要由兩個類實現,分別是:

l  DatagramSocket

DatagramSocket類實現“網路連接”,包括用戶端網路連接和伺服器端網路連接。雖然UDP方式的網路通訊不需要建立專用的網路連接,但是畢竟還是需要發送和接收資料,DatagramSocket實現的就是發送資料時的發射器,以及接收資料時的監聽器的角色。類比於TCP中的網路連接,該類既可以用於實現用戶端串連,也可以用於實現伺服器端串連。

l  DatagramPacket

DatagramPacket類實現對於網路中傳輸的資料封裝,也就是說,該類的對象代表網路中交換的資料。在UDP方式的網路編程中,無論是需要發送的資料還是需要接收的資料,都必須被處理成DatagramPacket類型的對象,該對象中包含發送到的地址、發送到的連接埠號碼以及發送的內容等。其實DatagramPacket類的作用類似於現實中的信件,在信件中包含信件發送到的地址以及接收人,還有發送的內容等,郵局只需要按照地址傳遞即可。在接收資料時,接收到的資料也必須被處理成DatagramPacket類型的對象,在該對象中包含發送方的地址、連接埠號碼等資訊,也包含資料的內容。和TCP方式的網路傳輸相比,IO編程在UDP方式的網路編程中變得不是必須的內容,結構也要比TCP方式的網路編程簡單一些。

下面介紹一下UDP方式的網路編程中,用戶端和伺服器端的實現步驟,以及通過基礎的樣本示範UDP方式的網路編程在Java語言中的實現方式。

UDP方式的網路編程,編程的步驟和TCP方式類似,只是使用的類和方法存在比較大的區別,下面首先介紹一下UDP方式的網路編程用戶端實現過程。

UDP用戶端編程涉及的步驟也是4個部分:建立串連、發送資料、接收資料和關閉串連。

首先介紹UDP方式的網路編程中建立串連的實現。其中UDP方式的建立串連和TCP方式不同,只需要建立一個連線物件即可,不需要指定伺服器的IP和連接埠號碼碼。實現的代碼為:

DatagramSocket ds = new DatagramSocket();

這樣就建立了一個用戶端串連,該用戶端串連使用系統隨機分配的一個本機電腦的未用連接埠號碼。在該串連中,不指定伺服器端的IP和連接埠,所以UDP方式的網路連接更像一個發射器,而不是一個具體的串連。

當然,可以通過制定串連使用的連接埠號碼來建立用戶端串連。

DatagramSocket ds = new DatagramSocket(5000);

這樣就是使用本機電腦的5000號連接埠建立了一個串連。一般在建立用戶端串連時沒有必要指定連接埠號碼碼。

接著,介紹一下UDP用戶端編程中發送資料的實現。在UDP方式的網路編程中,IO技術不是必須的,在發送資料時,需要將需要發送的資料內容首先轉換為byte數組,然後將資料內容、伺服器IP和伺服器連接埠號碼一起構造成一個DatagramPacket類型的對象,這樣資料的準備就完成了,發送時調用網路連接對象中的send方法發送該對象即可。例如將字串“Hello”發送到IP是127.0.0.1,連接埠號碼是10001的伺服器,則實現發送資料的代碼如下:

String s = “Hello”;
String host = “127.0.0.1”;
int port = 10001;
//將發送的內容轉換為byte數組
byte[] b = s.getBytes();
//將伺服器IP轉換為InetAddress對象
InetAddress server = InetAddress.getByName(host);
//構造發送的資料包對象
DatagramPacket sendDp = new DatagramPacket(b,b.length,server,port);
//發送資料
ds.send(sendDp);

在該範例程式碼中,不管發送的資料內容是什麼,都需要轉換為byte數組,然後將伺服器端的IP地址構造成InetAddress類型的對象,在準備完成以後,將這些資訊構造成一個DatagramPacket類型的對象,在UDP編程中,發送的資料內容、伺服器端的IP和連接埠號碼,都包含在DatagramPacket對象中。在準備完成以後,調用連線物件ds的send方法把DatagramPacket對象發送出去即可。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.