android的UDP编程实例
程序员文章站
2023-11-21 23:46:52
一、有的手机不能直接接收udp包,可能是手机厂商在定制rom的时候把这个功能给关掉了。1、可先在oncreate()方法里面实例化一个wifimanager.multica...
一、有的手机不能直接接收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();
}
}
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();
}
}
上一篇: MySQL数据库之单双表查询