IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> android组播 -> 正文阅读

[移动开发]android组播

通常,在传统的网络通讯中,有两种方式,一种是源主机和目标主机两台主机之间进行的“一对一”的通讯方式,即单播,第二种是一台源主机与网络中所有其他主机之间进行的通讯,即广播。那么,如果需要将信息从源主机发送到网络中的多个目标主机,要么采用广播方式,这样网络中所有主机都会收到信息,要么,采用单播方式,由源主机分别向各个不同目标主机发送信息。可以看出来,在广播方式下,信息会发送到不需要该信息的主机从而浪费带宽资源,甚至引起广播风暴:而单播方式下,会因为数据包的多次重复而浪费带宽资源,同时,源主机的负荷会因为多次的数据复制而加大,所以,单播与广播对于多点发送问题有缺陷。

在此情况下,组播技术就应用而生了。

组播又称多目标广播、多播。网络中使用的一种传输方式,它允许把 所发消息传送给所有可能目的地中的一个经过选择的子集,即向明确指出的多种地址输送信息。是一种在一个发送者和多个接收者之间进行通信的方法。与任播(anycast)和单播(unicast)一起,组播也是一种IPv6的包传送方式。组播在CDPD技术中的无线数据网络中也可以使用。

组播使用UDP对一定范围内的地址发送相同的一组Packet,即一次可以向多个接受者发出信息,其与单播的主要区别是地址的形式。IP协议分配了一定范围的地址空间给多播(多播只能使用这个范围内的IP),IPv4中组播地址范围为224.0.0.0到239.255.255.255。

组播IP地址用于标识一个IP组播组。IANA(internet assigned number authority)把D类地址空间分配给IP组播,其范围是从224.0.0.0到239.255.255.255。如二进制表示,IP组播地址前四位均为1110八位组⑴ 八位组⑵ 八位组⑶ 八位组⑷1110。

XXXX XXXXXXXX XXXXXXXX XXXXXXXX组播组可以是永久的也可以是临时的。组播组地址中,有一部分由官方分配的,称为永久组播组。永久组播组保持不变的是它的ip地址,组中的成员构成可以发生变化。永久组播组中成员的数量都可以是任意的,甚至可以为零。那些没有保留下来供永久组播组使用的ip组播地址,可以被临时组播组利用。

224.0.0.0~224.0.0.255为预留的组播地址(永久组地址),地址224.0.0.0保留不做分配,其它地址供路由协议使用。

224.0.1.0~238.255.255.255为用户可用的组播地址(临时组地址),全网范围内有效。

239.0.0.0~239.255.255.255为本地管理组播地址,仅在特定的本地范围内有效。常用的预留组播地址列表如下:

224.0.0.0 基准地址(保留)

224.0.0.1 所有主机的地址

224.0.0.2 所有组播路由器的地址

224.0.0.3 不分配

本案例中用224.0.0.3作为组播IP地址,Port 为18611

发送组播广播的代码:

package meiaomie.com.udpsyncplayer.udp;
import android.util.Log;
import java.io.UnsupportedEncodingException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;

/**
 * author : huyawen
 * e-mail : 1754397982@qq.com
 * time   : 2022/03/10
 * function: 发送组播的消息
 */
public class UdpMultiSend extends Thread {

    public String m_text;
    byte[] bytesToSend;//发送byte[] 数组
    String TAG = "UdpMultiSend";
    public int PORT = 18611;
    private String IP = "239.0.0.3";
    MulticastSocket multicastSocket;
    InetAddress inetAddress;

    public UdpMultiSend() {
        try {
            multicastSocket = new MulticastSocket(PORT);
            inetAddress = InetAddress.getByName(IP);
            multicastSocket.joinGroup(inetAddress);
        } catch (Exception e) {
            Log.e(TAG, "UdpMultiReceive: " + e.getMessage());
        }
    }


    //udp 发送消息要在一个线程里
    @Override
    public void run() {
        int TIMEOUT = 5000;
        try {
            multicastSocket.setSoTimeout(TIMEOUT);
            DatagramPacket sendPacket = new DatagramPacket(bytesToSend, bytesToSend.length, inetAddress, PORT);
            Log.e("SEND", m_text + "   ip" + IP + ":" + PORT + "     byte" + bytesToSend);
            multicastSocket.send(sendPacket);
            multicastSocket.close();
        } catch (Exception e) {
            e.printStackTrace();
            Log.e("SEND", e.getMessage());
        }
    }


    //发送字符串指令 转为byte[]数组
    public void setM_text(String m_text) {
        this.m_text = m_text;
        try {
            this.bytesToSend = m_text.getBytes("UTF-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    }

}

接收组播广播的代码:

package meiaomie.com.udpsyncplayer.udp;

import android.util.Log;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
import java.net.SocketException;

/**
 * author : huyawen
 * e-mail : 1754397982@qq.com
 * time   : 2022/03/10
 * function:接收组播 的消息
 */
public class UdpMultiReceive extends Thread {

    public String TAG = "UdpMultiReceive";
    public String info = "....";
    public int PORT = 18611;
    public byte[] receiveInfo = null;
    private String IP = "239.0.0.3";
    MulticastSocket multicastSocket;
    InetAddress inetAddress;

    public UdpMultiReceive() {
        try {
            multicastSocket = new MulticastSocket(PORT);
            inetAddress = InetAddress.getByName(IP);
            multicastSocket.joinGroup(inetAddress);
        } catch (Exception e) {
            Log.e(TAG, "UdpMultiReceive: " + e.getMessage());
        }
    }


    @Override
    public void run() {
        try {
            while (true) {
                byte[] inBuf = new byte[1024];
                DatagramPacket inPacket = new DatagramPacket(inBuf, inBuf.length);
                multicastSocket.receive(inPacket);
                receiveInfo = inPacket.getData();
                InetAddress inetAddress = inPacket.getAddress();
                //对方Ip
                String oppositeIp = inetAddress.getHostAddress();
                Log.e(TAG, "我是Ip== " + oppositeIp+" 发送过来的数据!");
                info = new String(inPacket.getData(), 0, inPacket.getLength());
                Log.e(TAG, "发过来的数据为=" + info);
            }
        } catch (SocketException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

使用的时候在activity中。开启两个线程。

发送数据的时候:要把数据set过去否则会报没有数据的错误。

  UdpMultiSend send=new UdpMultiSend();
  send.setM_text(edit_q.getText().toString());
  send.start();

接收的时候:在oncreate中即可。

  UdpMultiReceive receive=new UdpMultiReceive();
  receive.start();

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-03-12 17:41:04  更:2022-03-12 17:43:00 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年10日历 -2024/10/27 22:30:27-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码