導航:首頁 > 操作系統 > androidudp接收數據

androidudp接收數據

發布時間:2023-05-24 00:08:01

android 手機上能通過DatagramSocket收到PC端的UDP廣播嗎

在PC端直接用tcp調試助手發送數據,我另一台電腦能收到的,但是android的卻是有時可以收到有時收不到,平均幾十次收到10次左右,丟包不可能這么嚴重吧。,android的代碼如下,
ds = new DatagramSocket(1234, InetAddress.getByName(「192.168.1.3」));
dp = new DatagramPacket(content, content.length);
ds.receive(dp);
如果我在pc端發送綁定了IP的UDP數據包,android可以收到數據,但是PC端發送255的廣播UDP,android就收不到了。。查了一些資料,說是要加入許可權,加入以下的代碼,但實測發現效果一樣。

WifiManager manager = (WifiManager) this.getSystemService(Context.WIFI_SERVICE); WifiManager.MulticastLock lock= manager.createMulticastLock("localWifi");

② 如何修正安卓虛擬機收不到udp包的問題

前言
當我們做安卓開發時,大多數人還是習慣用虛擬機,畢竟真機巴拉來巴拉去的不如滑鼠方便,尤其是調試一些功能模塊時,比如socket udp , 下文說明如何用as+虛擬機調試 socket udp, 實測

如何搭建udp伺服器和客戶端不提了,簡單的搭建隨便找一個吧
首先我們的前提是 我們在pc上建立了一個UDP伺服器,目的是通過這伺服器給虛擬機發送一個udp包
但如何發送這個包呢?
如果想當然的這樣做在server上敬敬啟給"127.0.0.1:9014"發送包,然後在虛擬機的9014埠接受包,你會亮如發現無論發多少次,虛擬機什麼都收不到。 原因是,你稿坦這個包並不是發給虛擬機了,而是發給了本地埠,
也許你會說,給虛擬機發應該用虛擬機的ip地址,好的,通過嘗試我們發現給虛擬機的ip地址+9014埠,仍然無法收到。(我用工具查看的虛擬機ip地址是10.0.2.15)
正確步驟
1.把PC埠9014映射到虛擬機,意思就是當PC 9014埠收到udp包,它會轉發給虛擬機相應的埠
使用windows程序telnet即可達到映射的目的,(注意Telnet在win10需要開啟,可查找怎麼開啟這個程序)
打開cmd 輸入如下命令連接到本地虛擬機
telnet localhost 5554
連接成功後他會提示你輸入驗證,並告訴你驗證碼在哪裡

③ 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接收到數據,如何轉換成字元串

首先你要取得文件的路徑的字元串,然後定義一個集合l(list)將這些路徑都裝到集合中,讓後通過Intent將這個集合傳到盯沒敗下一個Activity(Intent inten=new Intent(),intent.putExtra("list",list);)就ok了。在下一個Activity中通過intent.getExtra("察敬list");就能得到傳過來的集合了。我沒有詳細的代碼,過程說得還是比較清楚凱顫的,希望對你有幫助。

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

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

⑥ Android UDP通訊(簡單demo)

本章節 比較簡單
直接上code了
首先創建一個UDP class 構造方法如下
通過newFixedThreadPool 創建一個線程池

然後
一個startUdp scoket 重要步驟

startSocketThread是一個 接收消息的子線程
內部是一個接收消息的循環
BROADCAST_IP 是通信對方的地址

利用廣播 把接收到的消息列印到前台

再然後創建一個發送message的方法

文章所有code 地址---> github
https://github.com/hanjole/Udpscoket_demo

⑦ unity發布android端UDP無法接受廣播數據

socket TCP和UPD 的鏈接方式一樣 只是將一個參數TCP改逗老成UDP而已 UDP解析碼旁包的時候 和發送包的時候 一般都帶有序號 保證包的順序 TCP是有遲指橡序發送的

⑧ Android 基於UDP的Socket通信

1、連接DatagramSocket的服務端(ip和port):開啟非同步線程和socket
2、發送數據(DatagramPacket):非同步
3、接收數據(DatagramPacket):注意連接狀態,非同步讀取
4、關閉連接:關閉DatagramSocket和對應線程

1、異常:android.os.NetworkOnMainThreadException。 socket需要在線程中使用
2、前後端統一傳輸或者接收協議 [requestcode size d1 d2 d3 ... ],在解析時候用得到
3、實施監控socket的連接狀態,還是用心跳包發過去,然後返回數據,一段時間沒有的話則代表socket連接失敗。
4、注意receive接收數據後的有效長度(一個是預存的buffer,一個是有效結果buffer)
5、客戶端連上去後不知道為何一定要先發送一次,才能接收?
6、UDP不安全,有長度限制64K

2019 (* ̄(oo) ̄) 諸事順利!

閱讀全文

與androidudp接收數據相關的資料

熱點內容
單片機編程取反 瀏覽:895
51單片機課程設計課題 瀏覽:897
手機淘寶登錄怎麼加密碼 瀏覽:484
linux快捷方式圖標 瀏覽:37
陽光車險的app叫什麼名字 瀏覽:461
購買單片機的器件時需要給商家啥 瀏覽:534
並行編譯技術的發展 瀏覽:549
阿里雲伺服器安裝管理 瀏覽:550
java手機開發教程 瀏覽:674
我的世界怎麼刪除伺服器數據 瀏覽:671
linux內存子系統 瀏覽:972
加密思維幣 瀏覽:690
魅族訪客文件夾 瀏覽:52
添加的文件夾怎麼找 瀏覽:617
程序員涉黃 瀏覽:700
maven編譯resources下的js 瀏覽:521
ubuntu文件移動命令 瀏覽:229
安卓i怎麼查找蘋果手機 瀏覽:951
雲伺服器宕機概率 瀏覽:232
在線買葯用什麼app知乎 瀏覽:815