基于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),需要新建一个线程完成该操作。同时接收和发送两个动作不能放在同一个设备上(因为端口一致会导致冲突),建议两台设备或虚拟机进行调试。
代码如下:
(接收线程)
(发送线程)
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; } }
相关文章推荐
- Android基于XMPP Smack Openfire下学习开发IM(四)单人聊天和多人聊天(发送消息、接收消息)
- Android基于XMPP Smack Openfire下学习开发IM(四)单人聊天和多人聊天(发送消息、接收消息)
- Android socket通过UDP的方式发送,接收数据
- Android UDP广播 客户端循环发送与接收
- 基于UDP协议的接收和发送实验
- Android之基于XMPP Smack Openfire 单人聊天和多人聊天(发送消息、接收消息)
- 基于微信红包插件的原理实现android任何APP自动发送评论(已开源)
- Android 基于xmpp协议,smack包,openfire服务端的高仿QQ的即时通讯实现【5】消息发送,接收;修改心情的实现
- linux下基于udp的简单的接收与发送程序,开发板与本机接收与发送信息
- Android基于XMPP Smack Openfire下学习开发IM(四)单人聊天和多人聊天(发送消息、接收消息)
- 基于微信红包插件的原理实现android任何APP自动发送评论(已开源)
- android之接收和发送广播的开机可自动运行程序
- 基于qt的udp聊天发送信息 有四处要设置自动滚屏 --------------- 续上
- Android发送和接收UDP广播
- 【教程】第 10 章 基于UDP协议的接收和发送
- Android基于XMPP Smack Openfire下学习开发IM(四)单人聊天和多人聊天(发送消息、接收消息)
- android 实现UDP发送和接收
- Android编程实现基于局域网udp广播自动建立socket连接的方法
- 基于UDP协议的网络编程(使用DatagramSocket发送接收数据)
- Android使用wifi通过UDP协议发送广播数据包给PC接收不到问题解决方法