android的UDP編程實(shí)例
更新時(shí)間:2013年11月04日 16:43:52 作者:
android的UDP編程實(shí)例和注意事項(xiàng)。
一、有的手機(jī)不能直接接收UDP包,可能是手機(jī)廠商在定制Rom的時(shí)候把這個(gè)功能給關(guān)掉了。
1、可先在oncreate()方法里面實(shí)例化一個(gè)WifiManager.MulticastLock 對象lock;具體如下:
WifiManager manager = (WifiManager) this
.getSystemService(Context.WIFI_SERVICE);
WifiManager.MulticastLock lock= manager.createMulticastLock("test wifi");
2、在調(diào)用廣播發(fā)送、接收報(bào)文之前先調(diào)用lock.acquire()方法;
3、用完之后及時(shí)調(diào)用lock.release()釋放資源,否決多次調(diào)用lock.acquire()方法,程序可能會崩,詳情請見
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)過這樣處理后,多數(shù)手機(jī)都能正常發(fā)送接收到廣播報(bào)文。
本小點(diǎn)轉(zhuǎn)載自Android手機(jī)接收不到UDP報(bào)文
二、在UDP通信中,android端發(fā)送UDP廣播包沒有問題。至于接收的話,有時(shí)候不能接收到包。
在UDP通信中,android端發(fā)送UDP廣播包沒有問題。至于接收的話,有時(shí)候不能接收到包。但是如果UDP包中指定了目標(biāo)主機(jī)的地址的話,那么android端就能正常接收。
下面上一段代碼,大家可用這段代碼進(jìn)行測試。
1、在一個(gè)Service里面,我們創(chuàng)建一個(gè)線程
public void onCreate() {//用于創(chuàng)建線程
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、弄一個(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ù)不能超過這個(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();
}
}
1、可先在oncreate()方法里面實(shí)例化一個(gè)WifiManager.MulticastLock 對象lock;具體如下:
復(fù)制代碼 代碼如下:
WifiManager manager = (WifiManager) this
.getSystemService(Context.WIFI_SERVICE);
WifiManager.MulticastLock lock= manager.createMulticastLock("test wifi");
2、在調(diào)用廣播發(fā)送、接收報(bào)文之前先調(diào)用lock.acquire()方法;
3、用完之后及時(shí)調(diào)用lock.release()釋放資源,否決多次調(diào)用lock.acquire()方法,程序可能會崩,詳情請見
Caused by: java.lang.UnsupportedOperationException: Exceeded maximum number of wifi locks
注;記得在配置文件里面添加如下權(quán)限:
復(fù)制代碼 代碼如下:
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />
經(jīng)過這樣處理后,多數(shù)手機(jī)都能正常發(fā)送接收到廣播報(bào)文。
本小點(diǎn)轉(zhuǎn)載自Android手機(jī)接收不到UDP報(bào)文
二、在UDP通信中,android端發(fā)送UDP廣播包沒有問題。至于接收的話,有時(shí)候不能接收到包。
在UDP通信中,android端發(fā)送UDP廣播包沒有問題。至于接收的話,有時(shí)候不能接收到包。但是如果UDP包中指定了目標(biāo)主機(jī)的地址的話,那么android端就能正常接收。
下面上一段代碼,大家可用這段代碼進(jìn)行測試。
1、在一個(gè)Service里面,我們創(chuàng)建一個(gè)線程
復(fù)制代碼 代碼如下:
public void onCreate() {//用于創(chuàng)建線程
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、弄一個(gè)UDP幫助類,這個(gè)類主要用于發(fā)送和接收數(shù)據(jù)
復(fù)制代碼 代碼如下:
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ù)不能超過這個(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();
}
}
您可能感興趣的文章:
- Android實(shí)現(xiàn)TCP斷點(diǎn)上傳 后臺C#服務(wù)接收
- Android使用socket創(chuàng)建簡單TCP連接的方法
- Android實(shí)現(xiàn)TCP客戶端接收數(shù)據(jù)的方法
- Android編程實(shí)現(xiàn)TCP客戶端的方法
- Android編程使用HTTP協(xié)議與TCP協(xié)議實(shí)現(xiàn)上傳文件的方法
- Android中使用tcpdump、wireshark進(jìn)行抓包并分析技術(shù)介紹
- Android中實(shí)現(xiàn)TCP和UDP傳輸實(shí)例
- Android下使用TCPDUMP實(shí)現(xiàn)數(shù)據(jù)抓包教程
- Android TCP 文件客戶端與服務(wù)器DEMO介紹
- Android網(wǎng)絡(luò)編程之UDP通信模型實(shí)例
- Android編程實(shí)現(xiàn)TCP、UDP客戶端通信功能示例
相關(guān)文章
Android 快速實(shí)現(xiàn)狀態(tài)欄透明樣式的示例代碼
下面小編就為大家分享一篇Android 快速實(shí)現(xiàn)狀態(tài)欄透明樣式的示例代碼,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-01-01
Android Native 內(nèi)存泄漏系統(tǒng)化解決方案
這篇文章主要介紹了Android Native 內(nèi)存泄漏系統(tǒng)化解決方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07
Android和JavaScript相互調(diào)用的方法
這篇文章主要介紹了Android和JavaScript相互調(diào)用的方法,實(shí)例分析了Android的WebView執(zhí)行JavaScript及JavaScript訪問Android的技巧,需要的朋友可以參考下2015-12-12
在Android中查看當(dāng)前Activity是否銷毀的操作
這篇文章主要介紹了在Android中查看當(dāng)前Activity是否銷毀的操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03
Android 解決WebView調(diào)用loadData()方法顯示亂碼的問題
這篇文章主要介紹了Android 解決WebView調(diào)用loadData()方法顯示亂碼的問題的相關(guān)資料,希望通過本文能幫助到大家解決這樣的問題,需要的朋友可以參考下2017-09-09
Android動(dòng)效Compose貝塞爾曲線動(dòng)畫規(guī)格詳解
這篇文章主要為大家介紹了Android動(dòng)效Compose貝塞爾曲線動(dòng)畫規(guī)格詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11
Android自定義dialog可選擇展示年月日時(shí)間選擇欄
這篇文章主要介紹了Android自定義dialog可選擇展示年月日時(shí)間選擇欄,非常不錯(cuò),具有參考借鑒價(jià)值,需要的的朋友參考下2017-03-03

