日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android如何实现TCP和UDP传输

發布時間:2025/3/17 Android 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android如何实现TCP和UDP传输 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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傳輸原理

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

  TCP服務器端代碼:

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

  TCP客戶端代碼:

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

  下面我們看看UDP:

UDP傳輸原理

  UDP服務器端代碼:

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

  UDP客戶端代碼:

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

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

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的Android如何实现TCP和UDP传输的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。