Android手机实现同一端口发送和接收UDP数据

有时候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数据。

你可能感兴趣的:(Android)