偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

Android開發(fā):如何實現(xiàn)TCP和UDP傳輸

移動開發(fā) Android
本文將為各位講述在Android下完成TCP和UDP傳輸?shù)慕鉀Q辦法,TCP和UDP在網(wǎng)絡(luò)傳輸中非常重要,在Android開發(fā)中同樣重要。

TCP和UDP在網(wǎng)絡(luò)傳輸中非常重要,在Android開發(fā)中同樣重要。

51CTO推薦專題:Android應(yīng)用開發(fā)詳解

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

什么是TCP?

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

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

在流量控制上,采用滑動窗口協(xié)議[1],協(xié)議中規(guī)定,對于窗口內(nèi)未經(jīng)確認(rèn)的分組需要重傳。

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

什么是UDP?

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

與所熟知的TCP(傳輸控制協(xié)議)協(xié)議一樣,UDP協(xié)議直接位于IP(網(wǎng)際協(xié)議)協(xié)議的頂層。根據(jù)OSI(開放系統(tǒng)互連)參考模型,UDP和TCP都屬于傳輸層協(xié)議。

UDP協(xié)議的主要作用是將網(wǎng)絡(luò)數(shù)據(jù)流量壓縮成數(shù)據(jù)報的形式。一個典型的數(shù)據(jù)報就是一個二進(jìn)制數(shù)據(jù)的傳輸單位。每一個數(shù)據(jù)報的前8個字節(jié)用來包含報頭信息,剩余字節(jié)則用來包含具體的傳輸數(shù)據(jù)。

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

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

TCP原理TCP傳輸原理

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

TCP服務(wù)器端代碼:

  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.                 //注意第二個參數(shù)據(jù)為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.         } 

TCP客戶端代碼:

  1. try {  
  2.             Socket s = new Socket("localhost", 12345);  
  3.             // outgoing stream redirect to socket  
  4.             OutputStream out = s.getOutputStream();  
  5.             // 注意第二個參數(shù)據(jù)為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.    
  15.         } catch (UnknownHostException e) {  
  16.             e.printStackTrace();  
  17.         } catch (IOException e) {  
  18.             e.printStackTrace();  
  19.         } 

下面我們看看UDP:

UDP傳輸遠(yuǎn)離UDP傳輸原理

UDP服務(wù)器端代碼:

  1. // UDP服務(wù)器監(jiān)聽的端口  
  2.         Integer port = 12345;  
  3.         // 接收的字節(jié)大小,客戶端發(fā)送的數(shù)據(jù)不能超過這個大小  
  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.                     // 準(zhǔn)備接收數(shù)據(jù)  
  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.             // 換成服務(wù)器端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. 多圖詳解 “Android UI”設(shè)計官方教程
  2. 圖文并茂 在MyEclipse 8.6上搭建Android開發(fā)環(huán)境
  3. Android開發(fā)必備的21個免費(fèi)資源和工具
  4. Intent,Android應(yīng)用核心探秘
  5. 在Ubuntu下建立Eclipse的Android開發(fā)環(huán)境
責(zé)任編輯:佚名 來源: ideasandroid
相關(guān)推薦

2013-05-27 10:48:16

TCPUDP傳輸協(xié)議

2020-08-03 08:10:52

UDPTCP通信

2010-06-09 11:38:37

傳輸層通信協(xié)議

2022-05-10 22:00:41

UDPTCP協(xié)議

2022-09-02 12:13:22

TCPUDP場景

2020-07-28 08:38:10

TCPUDP協(xié)議

2019-12-31 20:41:39

IPUDPTCP

2020-08-31 19:19:27

TCPUDP視屏面試

2010-07-06 15:50:12

TCP和UDP協(xié)議

2018-09-06 10:48:51

TCPUDP協(xié)議

2014-09-12 18:18:02

tcpudtUDP

2020-12-04 06:35:20

TCPUDP阿里

2018-03-16 15:14:08

Android傳輸文件

2010-06-13 15:32:57

TCP協(xié)議

2021-05-14 08:34:32

UDP TCP場景

2023-11-30 18:03:02

TCP傳輸

2019-04-16 09:27:46

2023-10-24 15:22:09

TCPUDP

2010-07-06 15:43:04

UDP協(xié)議

2019-03-26 14:07:39

TCPUDPDNS
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號