導航:首頁 > 操作系統 > androidudp傳輸

androidudp傳輸

發布時間:2022-05-11 13:57:44

android接收不到udp包嗎

1、有的手機不能直接接收UDP包,可能是手機廠商在定製Rom的時候把這個功能給關掉了。
2、在UDP通信中,android端發送UDP廣播包沒有問題。至於接收的話,有時候不能接收到包。

❷ android udp收發問題(埠)

發送端指定埠
DatagramSocket ds = new DatagramSocket(9000);

❸ 如何實現TCP和UDP傳輸

首先我們來看一下什麼是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伺服器端代碼:
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客戶端代碼:
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伺服器端代碼:
// 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客戶端代碼:
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(); } }

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

❹ 請問android用兩個模擬器udp通信傳輸音頻文件要怎麼做

用socket編程是可以的,網上有

❺ android中的tcp udp需要許可權嗎

android中的tcp和udp不需要任何許可權。因為它們都是網路通訊協議的一種,只要手機沒有問題,能夠上網,就可以使用TCP和UDP協議了。
TCP/IP是用於電腦通信的一組協議,我們通常稱之為TCP/IP協議族,它是七十年代中期美國國防部為其ARPANET廣域網開發的網路體系結構和協議標准,以它為基礎組建的Internet是目前國際上規模最大的電腦網路,正因為Internet的廣泛使用,使得TCP/IP成了事實上的標准。之所以說TCP/IP是一個協議族,是因為TCP/IP協議包括TCP、IP、UDP、ICMP、RIP、TELNET、FTP、SMTP、ARP、TFTP等許多協議,這些協議統稱為TCP/IP協議。
TCP/IP協議的名字實際上是來自最重要的兩個協議,TCP(傳輸控制協議)和IP(網際協議)。它負責把需要傳輸的信息分割成許多小包,也叫做信息包,然後把這些信息包發往目的地,它能有效地保證傳輸的安全性和正確性。
在Internet內部,信息不是以一個恆定的流從主機傳送到主機,而是把數據分解成小包,即數據包進行傳送。例如你傳送一封很長的信件給你的朋友,TCP就可以把這些信息分成很多個數據包,每個數據包用一個序號和一個接收地址來標定。此外,TCP還插入一些糾錯信息。
接著數據包被傳過網路,這就是IP的工作,即把它們傳送給遠程主機。在另一端,TCP接收到數據包並核查錯誤。如果有錯誤發生,TCP可以要求重發這個特定的數據包。只要所有的數據包都被正確地接收到,TCP將用序號來重新構造原始信息。換句話說,IP的工作是把原始數據從一地傳送到另一地,TCP的工作是管理這種流動並確保其數據是正確的。ß把數據分解成數據包有很多好處。首先,它允許Internet讓很多不同的用戶在同一時刻使用同一通訊線路。因為這些數據包不必一起輸送,所以通訊線路可以載著所有類型的數據包按它們自己的路徑從一地到另一地。就如一條高速公路上各個汽車都在公路上行駛。ß用數據包傳輸的另一個好處是:當某處出錯,只需重新傳送單個數據包,而不是整個信息,這樣會大大加快Internet的傳輸總速度。
TCP/IP是把電腦和通訊設備組織成網路的協議大家庭,兩個最重要的協議是TCP和IP。IP從一地到另一地傳輸數據,而TCP則保證它們都正確地工作。
目前,遍布世界范圍的Internet網路主要採用的就是TCP/IP協議,而且,國內大多數網路建設現在已朝著TCP/IP協議的方向發展。

❻ android udp通信需要什麼許可權

一、有的手機不能直接接收UDP包,可能是手機廠商在定製Rom的時候把這個功能給關掉了。
1、可先在oncreate()方法裡面實例化一個WifiManager.MulticastLock 對象lock;具體如下:
WifiManager manager = (WifiManager) this
.getSystemService(Context.WIFI_SERVICE);
WifiManager.MulticastLock lock= manager.createMulticastLock("test wifi");

2、在調用廣播發送、接收報文之前先調用lock.acquire()方法;
3、用完之後及時調用lock.release()釋放資源,否決多次調用lock.acquire()方法,程序可能會崩,詳情請見
Caused by: java.lang.UnsupportedOperationException: Exceeded maximum number of wifi locks
注;記得在配置文件裡面添加如下許可權:
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />

經過這樣處理後,多數手機都能正常發送接收到廣播報文。
本小點轉載自Android手機接收不到UDP報文
二、在UDP通信中,android端發送UDP廣播包沒有問題。至於接收的話,有時候不能接收到包。
在UDP通信中,android端發送UDP廣播包沒有問題。至於接收的話,有時候不能接收到包。但是如果UDP包中指定了目標主機的地址的話,那麼android端就能正常接收。
下面上一段代碼,大家可用這段代碼進行測試。
1、在一個Service裡面,我們創建一個線程

public void onCreate() {//用於創建線程
WifiManager manager = (WifiManager) this
.getSystemService(Context.WIFI_SERVICE);
udphelper = new UdpHelper(manager);

//傳遞WifiManager對象,以便在UDPHelper類裡面使用MulticastLock
udphelper.addObserver(MsgReceiveService.this);
tReceived = new Thread(udphelper);
tReceived.start();
super.onCreate();
}

2、弄一個UDP幫助類,這個類主要用於發送和接收數據

package com.example.com.ihome.bang.util;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.MulticastSocket;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.Observable;
import com.example.com.ihome.bang.tool.SendThread;
import android.net.wifi.WifiManager;
import android.util.Log;

/**
*
* UdpHelper幫助類
*
* @author 陳喆榕
*
*/
public class UdpHelper implements Runnable {
public Boolean IsThreadDisable = false;//指示監聽線程是否終止
private static WifiManager.MulticastLock lock;
InetAddress mInetAddress;
public UdpHelper(WifiManager manager) {
this.lock= manager.createMulticastLock("UDPwifi");
}
public void StartListen() {
// UDP伺服器監聽的埠
Integer port = 8903;
// 接收的位元組大小,客戶端發送的數據不能超過這個大小
byte[] message = new byte[100];
try {
// 建立Socket連接
DatagramSocket datagramSocket = new DatagramSocket(port);
datagramSocket.setBroadcast(true);
DatagramPacket datagramPacket = new DatagramPacket(message,
message.length);
try {
while (!IsThreadDisable) {
// 准備接收數據
Log.d("UDP Demo", "准備接受");
this.lock.acquire();

datagramSocket.receive(datagramPacket);
String strMsg=new String(datagramPacket.getData()).trim();
Log.d("UDP Demo", datagramPacket.getAddress()
.getHostAddress().toString()
+ ":" +strMsg );this.lock.release();
}
} catch (IOException e) {//IOException
e.printStackTrace();
}
} catch (SocketException e) {
e.printStackTrace();
}

}
public static void send(String message) {
message = (message == null ? "Hello IdeasAndroid!" : message);
int server_port = 8904;
Log.d("UDP Demo", "UDP發送數據:"+message);
DatagramSocket s = null;
try {
s = new DatagramSocket();
} catch (SocketException e) {
e.printStackTrace();
}
InetAddress local = null;
try {
local = InetAddress.getByName("255.255.255.255");
} catch (UnknownHostException e) {
e.printStackTrace();
}
int msg_length = message.length();
byte[] messageByte = message.getBytes();
DatagramPacket p = new DatagramPacket(messageByte, msg_length, local,
server_port);
try {

s.send(p);
s.close();

} catch (IOException e) {
e.printStackTrace();
}
}

@Override
public void run() {
StartListen();
}

❼ android的tcp和udp有什麼聯系

tcp和udp都是網路傳輸協議, 和android沒有直接關系。所有基於網路訪問的過程都可能涉及這2個協議。簡單來講:tcp是可靠連接,即傳輸的數據必須完整,如用戶登錄的信息的驗證; udp是不可靠連接,即傳輸過程不能保證數據的完整性,如語音聊天,當網路條件不好時,可能會丟失內容。

❽ android下有沒有udp的可靠傳輸庫

int bufsize = 64;
byte buf[] = new byte[bufsize];
DatagramSocket ds = new DatagramSocket(5555);

DatagramPacket dp = new DatagramPacket(buf, buf.length);
ds.setSoTimeout(50);
ds.receive(dp);
System.out.println(dp.getData());

要不斷執行、並處理錯誤

❾ android 如何用UDP協議接收無線硬體設備的數據

理論上來說是可以的,但是這個涉及到傳輸層的問題,需要你對通信原理、系統晶元、Android編程有很深的理解,建議放棄。

閱讀全文

與androidudp傳輸相關的資料

熱點內容
macd從入門到精通pdf 瀏覽:865
程序員回北京老家 瀏覽:323
藏族pdf 瀏覽:655
矩形密封圈壓縮量 瀏覽:591
電腦設置ntp時間同步伺服器地址 瀏覽:18
怎麼更有效招聘對日程序員 瀏覽:147
命令號角 瀏覽:275
格力雙轉子壓縮機 瀏覽:612
hp伺服器上的ip地址 瀏覽:560
c語言編程計算100以內的所有素數 瀏覽:624
命令輸入框 瀏覽:892
冰箱壓縮機發燙噪音 瀏覽:85
單片機棧溢出符號 瀏覽:330
命令與征服修改器怎麼用 瀏覽:485
什麼app比較費錢 瀏覽:832
為什麼同一個app的功能不一樣 瀏覽:232
小型工作室用什麼伺服器好 瀏覽:995
程序員的興趣 瀏覽:413
華為伺服器有什麼好 瀏覽:701
程序員和測試之間的關系 瀏覽:945