最近在使用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广播的代码:
udp广播demo下载
如有转载,请注明出处:http://blog.csdn.net/hjhrq1991
首先我们来看看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