Android-udp广播

最近在使用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 = "";// 报文内容

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		startButton = (Button) this.findViewById(R.id.start);
		startButton.setOnClickListener(this);
	}

	@Override
	public 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 block
				e.printStackTrace();
			}

			udpSocket.close();

		}
	}

}

udp广播demo下载

如有转载,请注明出处:http://blog.csdn.net/hjhrq1991
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值