有时候Android手机发送UDP消息,需要知道有没有发送成功,这就要监听反馈回来的消息。一般情况下,反馈的消息发送到的是手机发送端口,所以这时候发送端口和接收端口是同一个端口。在我的第一篇文章中(http://blog.csdn.net/u012833261/article/details/78982538),使用的就是DatagramSocket,这在启动监听线程时占用发送端口,造成无法同时接收和发送。这就很难办了,虽然也有其他的解决办法,但是有一种很简单的方法。在我的第一篇中,把DatagramSocket都替换掉。UDP数据传输使用java NIO中的DatagramChannel。定义两个变量
private DatagramChannel channel;
/**
* ByteBuffer,存放发送和接收的数据
*/
private ByteBuffer buf = ByteBuffer.allocate(60);
当然调用之前首先要初始化:
public 初始化函数(){
try {
channel = DatagramChannel.open();
channel.socket().bind(new InetSocketAddress(23564));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
发送数据:
public void send(String message){
try {
byte[] configInfo = message.getBytes();
buf.clear();
buf.put(configInfo);
buf.flip();
channel.send(buf, new InetSocketAddress(SERVER_IP, SERVER_PORT));
} catch (Exception e) {
e.printStackTrace();
}
}
接收数据:
public void StartListen() {
keepRunning = getKeepRunning();
while (keepRunning) {
try {
buf.clear();
channel.receive(buf);
//获取ByteBuffer的有效内容
buf.flip();
byte[] bytes = new byte[buf.limit()];
buf.get(bytes);
msg = new Message();
bundle = new Bundle();
//把数据放到buddle中
configMessage = new String(bytes);
bundle.putString(“receive”, configMessage);
//把buddle传递到message
msg.setData(bundle);
handler.sendMessage(msg);
} catch (Exception e) {
continue;
}
}
}
//利用Handler将接收的数据实时打印出来
Handler myHandler = new Handler(){
@Override
public void handleMessage(Message msg)
{
super.handleMessage(msg);
Bundle bundle=new Bundle();
//从传过来的message数据中取出传过来的绑定数据的bundle对象
bundle = msg.getData();
receive = bundle.getString(“receive”);
setMessage(receive);
}
};
这样使用Channel就可以使用同一个端口进行收发UDP数据。