您的位置:首页 > 移动开发 > Android开发

基于Android的UDP自动发现(接收与发送)

2018-01-19 23:13 525 查看
TCP和UDP的区别:

TCP(Transimission Control Protocol)即 传输控制协议:是面向连接的协议, 强调稳定可靠的连接,建立连接“三次握手”,断开连接需要“四次分手”,现常用于网络间视频与语音通话,及相应的网络间可靠的信息流通。

UDP(User Datagram Protocol)即 用户数据报协议:是面向报文的协议,两端无需建立连接即可传输数据,速度和效率都是TCP所不能比拟的,常用于局域网内数据互通,缓存读取,游戏及程序内高精度文件传输,NAT穿透等。

UDP在Android中的应用:

两端若需要建立UDP连接,

对于发送方:需要获取当前网络的host IP及自定的端口(建议大于1024)。

对于接收方:需要设定UDP连接的端口(与发送方端口保持一致),即可自动接收消息,其中该接收过程是阻塞式的,也就是说它一直在接收,当接收到了才会进行下一步(若接收到消息后还想继续接收,这时候需要把socket关闭,再能重复进行接收动作)

注意事项:由于接收动作是阻塞式的,因此不能放在主线程里(ANR),需要新建一个线程完成该操作。同时接收和发送两个动作不能放在同一个设备上(因为端口一致会导致冲突),建议两台设备或虚拟机进行调试。

代码如下:

(接收线程)

public class UdpReceiveThread extends Thread {
private final String TAG = "UdpReceiveThread";

@Override
public void run() {
while (isAlive() ) { //循环接收,isAlive() 判断防止无法预知的错误
try {
sleep(1000); //让它好好休息一会儿
DatagramSocket socket = new DatagramSocket(8888); //建立 socket,其中 8888 为端口号
byte data[] = new byte[1024];
DatagramPacket packet = new DatagramPacket(data, data.length);
socket.receive(packet); //阻塞式,接收发送方的 packet
String result = new String(packet.getData(), packet.getOffset(), packet.getLength()); //packet 转换
Log.i(TAG, "UDP result: " + result);
socket.close(); //必须及时关闭 socket,否则会出现 error

} catch (Exception e) {
e.printStackTrace();
break; //当 catch 到错误时,跳出循环
}
}
}
}


(发送线程)

public class UdpSendThread extends Thread {
public static final String TAG = "UdpSendThread";
private static int i = 0; //静态变量,记录发送消息的次数
@Override
public void run() {
try {
Set<Map.Entry<String, String> > entrySet = getAllLocalBroadIp().entrySet();
String broadIp = null;
for (Map.Entry<String, String> entry : entrySet) { //遍历当前的 IP
String localIp = entry.getKey();
broadIp = entry.getValue();
Log.i(TAG, "broadIp:" + broadIp + "\nlocalIp:" + localIp);
}

Log.d(TAG, "*** run udp send ***");
DatagramSocket socket = new DatagramSocket(8888); //自定端口号
InetAddress address = InetAddress.getByName(broadIp); //通过当前 IP 建立相应的 InetAddress
String data = "I love you" + "( " + i++ + " )";
byte dataByte[] = data.getBytes(); //建立数据
DatagramPacket packet = new DatagramPacket(dataByte, dataByte.length, address, 8888); //通过该数据建包
socket.send(packet); //开始发送该包
socket.close(); //其实对于发送方来说没必要关闭 socket,但为了防止无法预知的意外,建议关闭
Log.i(TAG, "send done,data: " + data );

}catch (Exception e) {
e.printStackTrace();
}

}

/**
* 获取本机ip的广播地址
*
*/
private static Map<String,String> getAllLocalBroadIp() {
Map<String,String> LocalIpAndbroadcastIp = new HashMap<>();
try {
Enumeration<NetworkInterface> b = NetworkInterface.getNetworkInterfaces();
while (b.hasMoreElements()) {
for (InterfaceAddress f : b.nextElement().getInterfaceAddresses()){
if(f.getBroadcast() != null){
LocalIpAndbroadcastIp.put(f.getAddress().getHostAddress(), f.getBroadcast().getHostAddress());
}
}
}
} catch (SocketException e) {
e.printStackTrace();
}
return LocalIpAndbroadcastIp;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  udp tcp socket datagram
相关文章推荐