Android開發:如何?TCP和UDP傳輸

來源:互聯網
上載者:User

標籤:

TCP和UDP在網路傳輸中非常重要,在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伺服器端代碼:

 

[java] view plaincopy 
  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.       
  21.         } catch (UnknownHostException e) {    
  22.             e.printStackTrace();    
  23.         } catch (IOException e) {    
  24.             e.printStackTrace();    
  25.         }   
  26. TCP用戶端代碼:  
  27. ?  
  28. try {    
  29.             Socket s = new Socket("localhost", 12345);    
  30.             // outgoing stream redirect to socket    
  31.             OutputStream out = s.getOutputStream();    
  32.             // 注意第二個參資料為true將會自動flush,否則需要需要手動操作out.flush()    
  33.             PrintWriter output = new PrintWriter(out, true);    
  34.             output.println("Hello IdeasAndroid!");    
  35.             BufferedReader input = new BufferedReader(newInputStreamReader(s    
  36.                     .getInputStream()));    
  37.             // read line(s)    
  38.             String message = input.readLine();    
  39.             Log.d("Tcp Demo", "message From Server:" + message);    
  40.             s.close();    
  41.       
  42.         } catch (UnknownHostException e) {    
  43.             e.printStackTrace();    
  44.         } catch (IOException e) {    
  45.             e.printStackTrace();    
  46.         }   

 

 

下面我們看看UDP:                          

                            

UDP伺服器端代碼:

[java] view plaincopy 
  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用戶端代碼:

 

[java] view plaincopy 
    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.     }  

Android開發:如何?TCP和UDP傳輸

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.