Ⅰ android udp收發問題(埠)
發送端指定埠
DatagramSocket ds = new DatagramSocket(9000);
Ⅱ android udp接收不到數據
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接收不到udp包嗎
1、有的手機不能直接接收UDP包,可能是手機廠商在定製Rom的時候把這個功能給關掉了。 2、在UDP通信中,android端發送UDP廣播包沒有問題。至於接收的話,有時候不能接收到包。
Ⅳ UDP能傳輸圖片嗎
傳文件要保證先後順序,最好自己加上標號驗證!否則不能保證先發出去的就能先收到!
Ⅳ android socket udp 怎麼封裝ip+報頭+協議
CP包
每個tcp都包含源埠號和目標埠號,加上ip頭中的源ip和目的ip,唯一確定一個tcp連接。序號用來標識從tcp發端向tcp收端發送的數據位元組流,它表示在這個報文段中的第一個數據位元組。序號欄位包含由這個主機選擇的該連接的初始序號isn(Initial Sequence Number)。該主機要發送數據的第一個位元組,序號為isn+1,因為syn佔用了一個序號。
IP包
IPV4報頭有12個必需的欄位和可選IP選項欄位,位於要發送的數據之前。如果使用IP層已有的庫或其他組件,一般不必考慮報頭中的大多數欄位,但程序代碼需要提供源端和目的端地址。
1、版本(4比特)
IP協議版本已經經過多次修訂,1981年的RFC0791描述了IPV4,RCF2460中介紹了IPV6。
2、報頭長度(4比特)
報頭長度是報頭數據的長度,以4位元組表示,也就是以32位元組為單位。報頭長度是可變的。必需的欄位使用20位元組(報頭長度為5,IP選項欄位最多有40個附加位元組(報頭長度為15)。
3、服務類型(8比特)
該欄位給出發送進程建議路由器如何處理報片的方法。可選擇最大可靠性、最小延遲、最大吞吐量和最小開銷。路由器可以忽略這部分。
4、數據報長度(16比特)
該欄位是報頭長度和數據位元組的總和,以位元組為單位。最大長度為65535位元組。
5、標識符(16比特)
原是數據的主機為數據報分配一個唯一的數據報標識符。在數據報傳向目的地址時,如果路由器將數據報分為報片,那麼每個報片都有相同的數據標識符。
6、標志(3比特)
標志欄位中有2為與報片有關。
位0:未用。
位1:不是報片。如果這位是1,則路由器就不會把數據報分片。路由器會盡可能把數據報傳給可一次接收整個數據報的網路;否則,路由器會放棄數據報,並返回 差錯報文,表示目的地址不可達。IP標准要求主機可以接收576位元組以內的數據報,因此,如果想把數據報傳給未知的主機,並想確認數據報沒有因為大小的原 因而被放棄,那麼就使用少於或等於576位元組的數據。
位2:更多的報片。如果該位為1,則數據報是一個報片,但不是該分片數據報的最後一個報片;如果該位為0,則數據報沒有分片,或者是最後一個報片。
7、報片偏移(13比特)
該欄位標識報片在分片數據報中的位置。其值以8位元組為單位,最大為8191位元組,對應65528位元組的偏移。
例如,將要發送的1024位元組分為576和424位元組兩個報片。首片的偏移是0,第二片的偏移是72(因為72×8=576)。
8、生存時間(8比特)
如果數據報在合理時間內沒有到達目的地,則網路就會放棄它。生存時間欄位確定放棄數據報的時間。
生存時間表示數據報剩餘的時間,每個路由器都會將其值減一,或遞減需要數理和傳遞數據報的時間。實際上,路由器處理和傳遞數據報的時間一般都小於1S,因此該值沒有測量時間,而是測量路由器之間跳躍次數或網段的個數。發送數據報的計算機設置初始生存時間。
9、協議(8比特)
該欄位指定數據報的數據部分所使用的協議,因此IP層知道將接收到的數據報傳向何處。TCP協議為6,UDP協議為17。
10、報頭檢驗和(16比特)
該字端使數據報的接收方只需要檢驗IP報頭中的
Ⅵ android:udp廣播
首先手機作為終端 可以不必要知道終端的數量、 還有就是我建議你多學習下基礎,android的廣播機制不是把廣播在終端之間傳輸,廣播是在應用程序裡面發送,在應用程序進行接收。個人建議基礎才是王道。 對於你現在這個問題,不妨採用發送消息的方式 實現該功能。一個終端發送消息 其他終端接收消息,當然也相當於寫一個socket通信。通信建立之後 ,可以取得各個連接的終端的IP 然後怎麼邏輯就看你怎麼寫演算法了。還有就是,這個功能也可以用消息推送的方式(建議採用此方法)、android系統內置有消息推送,邏輯都和上述的差不多,至於具體用那些方法 那些內置類,個人建議多查API。軟體開發必須靠自學。。。。
Ⅶ android子線程中怎麼使用udp收發數據
先實例化一個Handler再重寫handleMessage(Message msg)方法msg.getData().getXXX()獲得Thread線程發送的數據
Ⅷ android studio jpeg圖片顯示
可以用BitmapFactory這個工具類的decode方法來解碼這個數組,產生一個bitmap
然後就可以用ImageView來顯示這個bitmap
不過效率應該比較低
Ⅸ android UDP通訊--圖片發送
PC端:
/**
*把照片轉換成base64格式
*@parampath照片路徑
*@return轉換後的二進制照片
*/
privateStringgetImageStr(Stringpath){
Stringbase64code=null;
FileInputStreamfis=null;
ByteArrayOutputStreambaos=null;
Filefile=newFile(path);
if(file.exists()){
try{
fis=newFileInputStream(path);
}catch(FileNotFoundExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
baos=newByteArrayOutputStream();
byte[]buffer=newbyte[1024];
intcount=0;
try{
while((count=fis.read(buffer))>=0){
baos.write(buffer,0,count);
}
base64code=newString(Base64.encode(baos.toByteArray(),Base64.DEFAULT));
}catch(IOExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}finally{
try{
fis.close();
baos.close();
}catch(IOExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
}
returnbase64code;
}
android端:
/**
*將Base64編碼轉換為bitmap
*@parambase64Stringbase64字元串
*@return轉換後的bitmap
*/
privateBitmapbase64ToBitmap(Stringbase64String){
byte[]bytes=Base64.decode(base64String,Base64.DEFAULT);
Bitmapbitmap=BitmapFactory.decodeByteArray(bytes,0,bytes.length);
returnbitmap;
}
拿到bitmap,任意處理
Ⅹ 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();
}