首先手機(jī)作為終端 可以不必要知道終端的數(shù)量、 還有就是我建議你多學(xué)習(xí)下基礎(chǔ),android的廣播機(jī)制不是把廣播在終端之間傳輸,廣播是在應(yīng)用程序里面發(fā)送,在應(yīng)用程序進(jìn)行接收。個(gè)人建議基礎(chǔ)才是王道。 對(duì)于你現(xiàn)在這個(gè)問(wèn)題,不妨采用發(fā)送消息的方式 實(shí)現(xiàn)該功能。一個(gè)終端發(fā)送消息 其他終端接收消息,當(dāng)然也相當(dāng)于寫一個(gè)socket通信。通信建立之后 ,可以取得各個(gè)連接的終端的IP 然后怎么邏輯就看你怎么寫算法了。還有就是,這個(gè)功能也可以用消息推送的方式(建議采用此方法)、android系統(tǒng)內(nèi)置有消息推送,邏輯都和上述的差不多,至于具體用那些方法 那些內(nèi)置類,個(gè)人建議多查API。軟件開發(fā)必須靠自學(xué)。。。。

公司主營(yíng)業(yè)務(wù):成都做網(wǎng)站、成都網(wǎng)站建設(shè)、移動(dòng)網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。創(chuàng)新互聯(lián)是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來(lái)的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來(lái)驚喜。創(chuàng)新互聯(lián)推出札達(dá)免費(fèi)做網(wǎng)站回饋大家。
1、有的手機(jī)不能直接接收UDP包,可能是手機(jī)廠商在定制Rom的時(shí)候把這個(gè)功能給關(guān)掉了。 2、在UDP通信中,android端發(fā)送UDP廣播包沒(méi)有問(wèn)題。至于接收的話,有時(shí)候不能接收到包。
最近做項(xiàng)目時(shí),遇到一個(gè)對(duì)新人我來(lái)說(shuō)稍微有點(diǎn)麻煩的事情!
那就是使用udp協(xié)議發(fā)送廣播獲取服務(wù)器地址!
http都好說(shuō),github開源項(xiàng)目不知道有多少。
可是再難的問(wèn)題也要去解決!
發(fā)送廣播需要權(quán)限!
AndroidManifest.xml 中添加:
最少這三個(gè)是必須的,多的也忘了!
原因后面會(huì)講到
使用到RxJava:
udp發(fā)送與接受都需指定端口號(hào)
廣播地址是255.255.255.255
在之前添加權(quán)限的時(shí)候CHANGE_WIFI_MULTICAST_STATE有添加這個(gè)
往下面看
接下來(lái)我們開啟接收udp信息
發(fā)送消息?
謝謝該作者的文章讓我學(xué)會(huì)udp發(fā)送
前言
當(dāng)我們做安卓開發(fā)時(shí),大多數(shù)人還是習(xí)慣用虛擬機(jī),畢竟真機(jī)巴拉來(lái)巴拉去的不如鼠標(biāo)方便,尤其是調(diào)試一些功能模塊時(shí),比如socket udp , 下文說(shuō)明如何用as+虛擬機(jī)調(diào)試 socket udp, 實(shí)測(cè)
如何搭建udp服務(wù)器和客戶端不提了,簡(jiǎn)單的搭建隨便找一個(gè)吧
首先我們的前提是 我們?cè)趐c上建立了一個(gè)UDP服務(wù)器,目的是通過(guò)這服務(wù)器給虛擬機(jī)發(fā)送一個(gè)udp包
但如何發(fā)送這個(gè)包呢?
如果想當(dāng)然的這樣做在server上給"127.0.0.1:9014"發(fā)送包,然后在虛擬機(jī)的9014端口接受包,你會(huì)發(fā)現(xiàn)無(wú)論發(fā)多少次,虛擬機(jī)什么都收不到。 原因是,你這個(gè)包并不是發(fā)給虛擬機(jī)了,而是發(fā)給了本地端口,
也許你會(huì)說(shuō),給虛擬機(jī)發(fā)應(yīng)該用虛擬機(jī)的ip地址,好的,通過(guò)嘗試我們發(fā)現(xiàn)給虛擬機(jī)的ip地址+9014端口,仍然無(wú)法收到。(我用工具查看的虛擬機(jī)ip地址是10.0.2.15)
正確步驟
1.把PC端口9014映射到虛擬機(jī),意思就是當(dāng)PC 9014端口收到udp包,它會(huì)轉(zhuǎn)發(fā)給虛擬機(jī)相應(yīng)的端口
使用windows程序telnet即可達(dá)到映射的目的,(注意Telnet在win10需要開啟,可查找怎么開啟這個(gè)程序)
打開cmd 輸入如下命令連接到本地虛擬機(jī)
telnet localhost 5554
連接成功后他會(huì)提示你輸入驗(yàn)證,并告訴你驗(yàn)證碼在哪里
1、可先在oncreate()方法里面實(shí)例化一個(gè)WifiManager.MulticastLock 對(duì)象lock;具體如下:
WifiManager manager = (WifiManager) this
.getSystemService(Context.WIFI_SERVICE);
WifiManager.MulticastLock lock= manager.createMulticastLock("test wifi");
2、在調(diào)用廣播發(fā)送、接收?qǐng)?bào)文之前先調(diào)用lock.acquire()方法;
3、用完之后及時(shí)調(diào)用lock.release()釋放資源,否決多次調(diào)用lock.acquire()方法,程序可能會(huì)崩,詳情請(qǐng)見
Caused by: java.lang.UnsupportedOperationException: Exceeded maximum number of wifi locks
注;記得在配置文件里面添加如下權(quán)限:
uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" /
經(jīng)過(guò)這樣處理后,多數(shù)手機(jī)都能正常發(fā)送接收到廣播報(bào)文。
本小點(diǎn)轉(zhuǎn)載自Android手機(jī)接收不到UDP報(bào)文
二、在UDP通信中,android端發(fā)送UDP廣播包沒(méi)有問(wèn)題。至于接收的話,有時(shí)候不能接收到包。
在UDP通信中,android端發(fā)送UDP廣播包沒(méi)有問(wèn)題。至于接收的話,有時(shí)候不能接收到包。但是如果UDP包中指定了目標(biāo)主機(jī)的地址的話,那么android端就能正常接收。
下面上一段代碼,大家可用這段代碼進(jìn)行測(cè)試。
1、在一個(gè)Service里面,我們創(chuàng)建一個(gè)線程
public void onCreate() {//用于創(chuàng)建線程
WifiManager manager = (WifiManager) this
.getSystemService(Context.WIFI_SERVICE);
udphelper = new UdpHelper(manager);
//傳遞WifiManager對(duì)象,以便在UDPHelper類里面使用MulticastLock
udphelper.addObserver(MsgReceiveService.this);
tReceived = new Thread(udphelper);
tReceived.start();
super.onCreate();
}
2、弄一個(gè)UDP幫助類,這個(gè)類主要用于發(fā)送和接收數(shù)據(jù)
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;//指示監(jiān)聽線程是否終止
private static WifiManager.MulticastLock lock;
InetAddress mInetAddress;
public UdpHelper(WifiManager manager) {
this.lock= manager.createMulticastLock("UDPwifi");
}
public void StartListen() {
// UDP服務(wù)器監(jiān)聽的端口
Integer port = 8903;
// 接收的字節(jié)大小,客戶端發(fā)送的數(shù)據(jù)不能超過(guò)這個(gè)大小
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) {
// 準(zhǔn)備接收數(shù)據(jù)
Log.d("UDP Demo", "準(zhǔn)備接受");
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發(fā)送數(shù)據(jù):"+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();
}
}
希望能幫到你。
本文標(biāo)題:androidudp,Androidudp組播只進(jìn)一次
URL地址:http://chinadenli.net/article14/dseehge.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)、云服務(wù)器、面包屑導(dǎo)航、標(biāo)簽優(yōu)化、建站公司、營(yíng)銷型網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)