Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 高級開發 >> Android開發:如何實現TCP和UDP傳輸

Android開發:如何實現TCP和UDP傳輸

編輯:高級開發

TCP和UDP在網絡傳輸中非常重要,在android開發中同樣重要。

51CTO推薦專題:android應用開發詳解

首先我們來看一下什麼是TCP和UDP。

什麼是TCP?

TCP:Transmission Control Protocol 傳輸控制協議TCP是一種面向連接(連接導向)的、可靠的、基於字節流的運輸層(Transport layer)通信協議,由IETF的RFC 793說明(specifIEd)。在簡化的計算機網絡OSI模型中,它完成第四層傳輸層所指定的功能應用層向TCP層發送用於網間傳輸的、用8位字節表示的數據流,然後TCP把數據流分割成適當長度的報文段(通常受該計算機連接的網絡的數據鏈路層的最大傳送單元(MTU)的限制)。之後TCP把結果包傳給IP層,由它來通過網絡將包傳送給接收端實體的TCP層。TCP為了保證不發生丟包,就給每個字節一個序號,同時序號也保證了傳送到接收端實體的包的按序接收。然後接收端實體對已成功收到的字節發回一個相應的確認(ACK);如果發送端實體在合理的往返時延(RTT)內未收到確認,那麼對應的數據(假設丟失了)將會被重傳。TCP用一個校驗和函數來檢驗數據是否有錯誤;在發送和接收時都要計算校驗和。

首先,TCP建立連接之後,通信雙方都同時可以進行數據的傳輸,其次,他是全雙工的;在保證可靠性上,采用超時重傳和捎帶確認機制。

在流量控制上,采用滑動窗口協議[1],協議中規定,對於窗口內未經確認的分組需要重傳。

在擁塞控制上,采用慢啟動算法。

什麼是UDP?

UDP 是User Datagram Protocol的簡稱, 中文名是用戶數據包協議,是 OSI 參考模型中一種無連接的傳輸層協議,提供面向事務的簡單不可靠信息傳送服務。它是IETF RFC 768是UDP的正式規范。在網絡中它與TCP協議一樣用於處理數據包。在OSI模型中,在第四層——傳輸層,處於IP協議的上一層。UDP有不提供數據報分組、組裝和不能對數據包的排序的缺點,也就是說,當報文發送之後,是無法得知其是否安全完整到達的。 UDP用來支持那些需要在計算機之間傳輸數據的網絡應用。包括網絡視頻會議系統在內的眾多的客戶/服務器模式的網絡應用都需要使用UDP協議。UDP協議從問世至今已經被使用了很多年,雖然其最初的光彩已經被一些類似協議所掩蓋,但是即使是在今天,UDP仍然不失為一項非常實用和可行的網絡傳輸層協議。

與所熟知的TCP(傳輸控制協議)協議一樣,UDP協議直接位於IP(網際協議)協議的頂層。根據OSI(開放系統互連)參考模型,UDP和TCP都屬於傳輸層協議。

UDP協議的主要作用是將網絡數據流量壓縮成數據報的形式。一個典型的數據報就是一個二進制數據的傳輸單位。每一個數據報的前8個字節用來包含報頭信息,剩余字節則用來包含具體的傳輸數據。

TCP和UDP在android中的使用和在Java裡是完全一樣的。

首先我們看看TCP連接,下圖為TCP連接的一個示意圖:

TCP原理TCP傳輸原理

是不是很好理解,這裡就不多說了,直接看代碼吧!實踐出真知。

TCP服務器端代碼:

  1. try {
  2. Boolean endFlag = false;
  3. ServerSocket ss = new ServerSocket(12345);
  4. while (!endFlag) {
  5. // 等待客戶端連接
  6. Socket s = ss.accept();
  7. BufferedReader input = new BufferedReader(newInputStreamReader(s.getInputStream()));
  8. //注意第二個參數據為true將會自動flush,否則需要需要手動操作output.flush()
  9. PrintWriter output = newPrintWriter(s.getOutputStream(),true);
  10. String message = input.readLine();
  11. Log.d("Tcp Demo", "message from ClIEnt:"+message);
  12. output.println("message received!");
  13. //output.flush();
  14. if("shutDown".equals(message)){
  15. endFlag=true;
  16. }
  17. s.close();
  18. }
  19. ss.close();
  20. } catch (UnknownHostException e) {
  21. e.printStackTrace();
  22. } catch (IOException e) {
  23. e.printStackTrace();
  24. }

TCP客戶端代碼:

  1. try {
  2. Socket s = new Socket("localhost", 12345);
  3. // outgoing stream redirect to socket
  4. OutputStream out = s.getOutputStream();
  5. // 注意第二個參數據為true將會自動flush,否則需要需要手動操作out.flush()
  6. PrintWriter output = new PrintWriter(out, true);
  7. output.println("Hello Ideasandroid!");
  8. BufferedReader input = new BufferedReader(newInputStreamReader(s
  9. .getInputStream()));
  10. // read line(s)
  11. String message = input.readLine();
  12. Log.d("Tcp Demo", "message From Server:" + message);
  13. s.close();
  14. } catch (UnknownHostException e) {
  15. e.printStackTrace();
  16. } catch (IOException e) {
  17. e.printStackTrace();
  18. }

下面我們看看UDP:

UDP傳輸遠離UDP傳輸原理

UDP服務器端代碼:

  1. // UDP服務器監聽的端口
  2. Integer port = 12345;
  3. // 接收的字節大小,客戶端發送的數據不能超過這個大小
  4. byte[] message = new byte[1024];
  5. try {
  6. // 建立Socket連接
  7. DatagramSocket datagramSocket = new DatagramSocket(port);
  8. DatagramPacket datagramPacket = new DatagramPacket(message,
  9. message.length);
  10. try {
  11. while (true) {
  12. // 准備接收數據
  13. datagramSocket.receive(datagramPacket);
  14. Log.d("UDP Demo", datagramPacket.getAddress()
  15. .getHostAddress().toString()
  16. + ":" + new String(datagramPacket.getData()));
  17. }
  18. } catch (IOException e) {
  19. e.printStackTrace();
  20. }
  21. } catch (SocketException e) {
  22. e.printStackTrace();
  23. }

UDP客戶端代碼:

  1. public static void send(String message) {
  2. message = (message == null ? "Hello Ideasandroid!" : message);
  3. int server_port = 12345;
  4. DatagramSocket s = null;
  5. try {
  6. s = new DatagramSocket();
  7. } catch (SocketException e) {
  8. e.printStackTrace();
  9. }
  10. InetAddress local = null;
  11. try {
  12. // 換成服務器端IP
  13. local = InetAddress.getByName("localhost");
  14. } catch (UnknownHostException e) {
  15. e.printStackTrace();
  16. }
  17. int msg_length = message.length();
  18. byte[] messagemessageByte = message.getBytes();
  19. DatagramPacket p = new DatagramPacket(messageByte, msg_length, local,
  20. server_port);
  21. try {
  22. s.send(p);
  23. } catch (IOException e) {
  24. e.printStackTrace();
  25. }
  26. }

代碼中需要注意的地方已做了注釋,希望本文對您有所幫助!

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved