Android-udp广播

来源:互联网 发布:淘宝虚拟物品出售规则 编辑:程序博客网 时间:2024/05/21 06:25
最近在使用udp广播发送消息,第一次使用,出现了点小毛病,一直发送有问题,不管怎么发都会收到自己的包,我就很好奇,研究了下,发现是我细节问题。现特来分享下经验,希望各位大大以及新入门的朋友们注意细节。
首先我们来看看DatagramSocket这个类:
DatagramSocket类用于创建接收和发送UDP的Socket实例。和Socket类依赖SocketImpl类一样,DatagramSocket类的实现也依靠专门为它设计的DatagramScoketImplFactory类。DatagramSocket类有3个构建器:
  DatagramSocket():创建实例。这是个比较特殊的用法,通常用于客户端编程,它并没有特定监听的端口,仅仅使用一个临时的。
  DatagramSocket(int port):创建实例,并固定监听Port端口的报文。
  DatagramSocket(int port, InetAddress localAddr):这是个非常有用的构建器,当一台机器拥有多于一个IP地址的时候,由它创建的实例仅仅接收来自LocalAddr的报文。

  值得注意的是,在创建DatagramSocket类实例时,如果端口已经被使用,会产生一个SocketException的异常抛出,并导致程序非法终止,这个异常应该注意捕获。


我之前出现的问题就是在new  DatagramSocket()这里,我当初没注意,写成了new  DatagramSocket(int port),以为这个port是报文的端口号,其实这里这个port是本机udp socket的监听端口号。虽然我后面new DatagramPacket时也有把这个port放进去了,但是因为我监听的端口也是这个端口,故udp广播发出去的时候本机监听到了把报文接收了。


好了,我的问题说了,下面分享下我写udp广播的代码:
package com.example.sendudpbroadcasttest;import java.io.IOException;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetAddress;import android.os.Bundle;import android.app.Activity;import android.util.Log;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;public class MainActivity extends Activity implements OnClickListener {Button startButton;private String order = "";// 报文内容@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);startButton = (Button) this.findViewById(R.id.start);startButton.setOnClickListener(this);}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.start:new BroadCastUdp().start();break;}}/** * 发送广播 *  * @author huangrenqiu *  */public class BroadCastUdp extends Thread {private DatagramSocket udpSocket;private static final String LOG_TAG = "TAG";private static final int DEFAULT_PORT = 10328;// 报文端口号private byte[] dataReceive = new byte[1024];private String udpresult; // 返回的消息public BroadCastUdp() {}public void run() {DatagramPacket dataPacket = null;/** * 发送广播 */try {InetAddress broadcastAddr;broadcastAddr = InetAddress.getByName("255.255.255.255");// 之前我在这里new socket的时候把DEFAULT_PORT也加上去了,导致广播失败udpSocket = new DatagramSocket();byte[] data = order.getBytes("utf8");dataPacket = new DatagramPacket(data, data.length,broadcastAddr, DEFAULT_PORT);udpSocket.send(dataPacket);} catch (Exception e) {Log.e(LOG_TAG, e.toString());}/** * 接受广播 */DatagramPacket packetReceive = new DatagramPacket(dataReceive,dataReceive.length);try {udpSocket.receive(packetReceive);udpresult = new String(packetReceive.getData(),packetReceive.getOffset(), packetReceive.getLength());String ip = packetReceive.getAddress().getHostAddress();System.out.println("hrq------Ip地址:" + ip + "-----返回消息-----"+ udpresult);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}udpSocket.close();}}}

udp广播demo下载

如有转载,请注明出处:http://blog.csdn.net/hjhrq1991
1 0