手机
当前位置:查字典教程网 >编程开发 >安卓软件开发 >android的UDP编程实例
android的UDP编程实例
摘要:一、有的手机不能直接接收UDP包,可能是手机厂商在定制Rom的时候把这个功能给关掉了。1、可先在oncreate()方法里面实例化一个Wif...

一、有的手机不能直接接收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();

}

}

【android的UDP编程实例】相关文章:

Android图片处理实例介绍(图)

刷新android中的媒体库

android中选中菜单的显示跳转和隐式跳转的实例介绍

Android Thread 介绍与实例

android屏幕全屏的实现代码

Android:多线程之AsyncTask

android LinearLayout 布局实例代码

关于学习android中的.9.png的笔记

android内存优化之图片优化

Android:多线程之进程与线程

精品推荐
分类导航