首先是发送
package remote.com;
import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.nio.Buffer;
import java.util.ArrayList;
import java.util.List;
import udpreceive.com.UdpReceive;
import android.app.Activity;
import android.content.Intent;
import android.hardware.Camera.Size;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class RemoteActivity extends Activity {
/** Called when the activity is first created. */
private Button start_button;
private Button end_button;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
start_button = (Button)findViewById(R.id.start_bu);
end_button = (Button)findViewById(R.id.end_bu);
Intent intent = new Intent();
intent.setClass(RemoteActivity.this, UdpReceive.class);
RemoteActivity.this.startService(intent);
System.out.println("mian activity thread = " + Thread.currentThread().getId());
start_button.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
int server_port = 60000;
String server_addr = "192.168.1.233";
String aa = "aa";
try {
byte[] bytesa = aa.getBytes();
int bytesa_len = bytesa.length;
DatagramSocket socket = new DatagramSocket(server_port);
InetAddress local = InetAddress.getByName(server_addr);
DatagramPacket sendSocket = new DatagramPacket(bytesa, bytesa_len, local, server_port);
socket.send(sendSocket);
System.out.println("send success");
socket.close(); //很关键, 发完后必须cloas 不然再点就发不了了
} catch (Exception e) {
// TODO: handle
}
System.out.println("main activity thread id = " + Thread.currentThread().getId());
}
});
end_button.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent = new Intent();
intent.setClass(RemoteActivity.this, UdpReceive.class);
RemoteActivity.this.stopService(intent);
}
});
//
}
//
}
然后是接收 ,接收 是新建了一个线程 , new thread.start
package cfg.mft;
import gloabal.mft.MyApplication;
import java.io.IOException;
import java.net.BindException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
import android.app.Activity;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.net.wifi.WifiManager;
import android.net.wifi.WifiManager.MulticastLock;
import android.os.Bundle;
import android.os.IBinder;
import android.util.Log;
public class CfgUdpReceive extends Service{
private boolean threadDisable;
private int count;
MyApplication app;
WifiManager wifi;
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
System.out.println( "到了UdpReceive了");
new Thread(new ServerThread()).start();
}
class ServerThread extends Thread{
public void run(){
Log.d("UDP Demo","到了里面了");
while (true) {
// UDP服务器监听的端口
try {
DatagramSocket socket = new DatagramSocket(15001);
byte data [] = new byte[1024];
//创建一个空的DatagramPacket对象
DatagramPacket packet = new DatagramPacket(data,data.length);
//使用receive方法接收客户端所发送的数据
if(socket == null){
break;
}
wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
MulticastLock ml = wifi.createMulticastLock("just some tag text");
ml.acquire();
//
socket.receive(packet);
String result = new String(packet.getData(),packet.getOffset(),packet.getLength());
Log.d("log", "收到udpReceive");
//System.out.println("result--->" + result + "\n" + " now thread id = " + Thread.currentThread().getId());
app = (MyApplication) getApplication();
app.setName(1);
ml.release();
socket.close();
} catch (Exception e) {
// TODO: handle exception
}
}
}
}
@Override
public void onDestroy() {
super.onDestroy();
this.threadDisable = true;
Log.v("CountService", "on destroy");
}
public int getCount() {
return count;
}
}
然后是 manifest 里面添加权限
<uses-permission android:name="android.permission.INTERNET"/>
--
关于HTC 手机不能接收 问题 在 while 前 执行 下面的
WifiManager wifi; wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE); MulticastLock ml = wifi.createMulticastLock("just some tag text"); ml.acquire();
如果 执行完了, 在 while 里面的 最后 执行
ml.release();
//创建一个DatagramSocket对象,并指定监听的端口号
DatagramSocket socket = new DatagramSocket(15001);
byte data [] = new byte[1024];
//创建一个空的DatagramPacket对象
DatagramPacket packet = new DatagramPacket(data,data.length);
//使用receive方法接收客户端所发送的数据
wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
MulticastLock ml = wifi.createMulticastLock("just some tag text");
ml.acquire();
while (true) {
socket.receive(packet);
String result = new String(packet.getData(),packet.getOffset(),packet.getLength());
//System.out.println("result--->" + result + "\n" + " now thread id = " + Thread.currentThread().getId());
app = (MyApplication) getApplication();
app.setName(1);
ml.release();
}
---
如果在虚拟机里面 搞不定, 不能接收 UDP 通知, 那需要 改 下 ip端口
解决方法:
1. 运行模拟器
2. 打开window 命令行
执行:telnet localhost 5554 或者是 telnet 127.0.0.1 5554
5554是模拟器的端口,执行之后会进入android console
3. 在console下执行:
redir add udp :端口号:端口号
例如:
redir add udp:22221:22221
其中,第一个端口号是模拟器1的端口,第二个端口号是模拟器2端口。(端口映射)
执行此命令之后,会把模拟器 22221 端口发送的数据通过本机转到模拟器的22221端口,就能从22221端口接收UDP数据包了
-----------------------------------------------------------------------------
此外以上的做法有个个确定就是 在 接收的时候 要指定 端口 ,下面这个 接收方式 在同一个socket 下面就不用 在接收的时候指定端口了
class ServerThread extends Thread{
public void run(){
int server_port = 8257;
String server_addr = "192.168.1.233";
String aa = "aaaa";
try {
byte[] b = aa.getBytes();
int b_len = b.length;
socket = new DatagramSocket(server_port);
InetAddress local = InetAddress.getByName(server_addr);
DatagramPacket sendSocket = new DatagramPacket(b, b_len, local, server_port);
socket.send(sendSocket);
System.out.println("send success" );
} catch (Exception e) {
// TODO: handle
e.printStackTrace();
}
byte buff[]=new byte[1024];
DatagramPacket receivePacket=new DatagramPacket(buff,buff.length);
try {
socket.setSoTimeout(5000); //设置接收延迟, 即 当发送后的多少时间内没有返回的话就无效
socket.receive(receivePacket);
String result = new String(receivePacket.getData(),receivePacket.getOffset(),receivePacket.getLength());
String rr = bin2hex(result);
System.out.println("result--->" + rr + "\n" + " now thread id = " + Thread.currentThread().getId());
} catch (Exception e) {
// TODO: handle exception
socket.close();
}
//
}
}
如果是接收多个UDP 包
try {
socket.setSoTimeout(5000); 设置接收延迟, 即 当发送后的多少时间内没有返回的话就无效
String re = "";
try {
while (true) {
re = re + "[";
socket.receive(receivePacket);
repacs=receivePacket.getData();
int effLength=receivePacket.getLength();
repac=new byte[effLength];
for (int i = 0; i < effLength; i++) {
re = re + to16(repacs[i]);
}
re = re + "]";
}
}catch (Exception e) {
// TODO: handle exception
}
socket.close();
re=re.substring(0, re.length()-1);
System.out.println("result--->" + re );
return re.toString();
} catch (Exception e) {
// TODO: handle exception
}
socket.close();