Android MulticastSocket IP组播
MulticastSocket是对等的关系,也就是他们通过IP多点组播保留的地址来相互接收在这个组的Socket发送的消息
我写了一个例子,MultiSocketB是一个service,用于先接收再发送,MultiSocketA用于先发送再接收,完成这一动作后退出
记得要加使用网络的权限
- <uses-permission android:name="android.permission.INTERNET" />
先看MultiSocketA
- <?xml version="1.0" encoding="utf-8"?>
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.example.multicastsocketsend"
- android:versionCode="1"
- android:versionName="1.0" >
- <uses-permission android:name="android.permission.INTERNET" />
- <uses-sdk
- android:minSdkVersion="8"
- android:targetSdkVersion="17" />
- <application
- android:allowBackup="true"
- android:icon="@drawable/ic_launcher"
- android:label="@string/app_name"
- android:theme="@style/AppTheme" >
- <activity
- android:name="com.example.multicastsocketsend.MultiSocketA"
- android:label="@string/app_name" >
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- </activity>
- </application>
- </manifest>
- package com.example.multicastsocketsend;
- import java.io.IOException;
- import java.net.DatagramPacket;
- import java.net.InetAddress;
- import java.net.MulticastSocket;
- import android.app.Activity;
- import android.os.Bundle;
- import android.os.Handler;
- import android.os.HandlerThread;
- import android.util.Log;
- /**
- * @author lijinwei
- * 本应用用于实现IP多点广播
- * 若要使用多点广播时,则需要让一个数据报标有一组目标主机地址,当数据报发出后,整个组的所有主机都能收到该数据报。
- * IP多点广播(或多点发送)实现了将单一信息发送到多个接收者的广播,其思想是设置一组特殊网络地址作为多点广播地址,每一个多点广播地址都被看做一个组,
- * 当客户端需要发送、接收广播信息时,加入到该组即可。
- */
- public class MultiSocketA extends Activity {
- protected static final String TAG = "MultiSocketA";
- private Handler mHandler;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- //通过Handler启动线程
- HandlerThread handlerThread = new HandlerThread("MultiSocketA");
- handlerThread.start();
- mHandler = new Handler(handlerThread.getLooper());
- mHandler.post(mRunnable);
- }
- private Runnable mRunnable = new Runnable() {
- public void run() {
- Log.v(TAG, "run...");
- try {
- sendMultiBroadcast();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- private void sendMultiBroadcast() throws IOException {
- Log.v(TAG, "sendMultiBroadcast...");
- /*
- * 实现多点广播时,MulticastSocket类是实现这一功能的关键,当MulticastSocket把一个DatagramPacket发送到多点广播IP地址,
- * 该数据报将被自动广播到加入该地址的所有MulticastSocket。MulticastSocket类既可以将数据报发送到多点广播地址,
- * 也可以接收其他主机的广播信息
- */
- MulticastSocket socket = new MulticastSocket(8600);
- //IP协议为多点广播提供了这批特殊的IP地址,这些IP地址的范围是224.0.0.0至239.255.255.255
- InetAddress address = InetAddress.getByName("224.0.0.1");
- /*
- * 创建一个MulticastSocket对象后,还需要将该MulticastSocket加入到指定的多点广播地址,
- * MulticastSocket使用jionGroup()方法来加入指定组;使用leaveGroup()方法脱离一个组。
- */
- socket.joinGroup(address);
- /*
- * 在某些系统中,可能有多个网络接口。这可能会对多点广播带来问题,这时候程序需要在一个指定的网络接口上监听,
- * 通过调用setInterface可选择MulticastSocket所使用的网络接口;
- * 也可以使用getInterface方法查询MulticastSocket监听的网络接口。
- */
- //socket.setInterface(address);
- DatagramPacket packet;
- //发送数据包
- Log.v(TAG, "send packet");
- byte[] buf = "Hello I am MultiSocketA".getBytes();
- packet = new DatagramPacket(buf, buf.length, address, 8601);
- socket.send(packet);
- //接收数据
- Log.v(TAG, "receiver packet");
- byte[] rev = new byte[512];
- packet = new DatagramPacket(rev, rev.length);
- socket.receive(packet);
- Log.v(TAG, "get data = " + new String(packet.getData()).trim()); //不加trim,则会打印出512个byte,后面是乱码
- //退出组播
- socket.leaveGroup(address);
- socket.close();
- }
- };
- }
再看MultiSocketB
- <?xml version="1.0" encoding="utf-8"?>
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.example.multicastsocketreceiver"
- android:versionCode="1"
- android:versionName="1.0" >
- <uses-permission android:name="android.permission.INTERNET" />
- <uses-sdk
- android:minSdkVersion="8"
- android:targetSdkVersion="17" />
- <application
- android:allowBackup="true"
- android:icon="@drawable/ic_launcher"
- android:label="@string/app_name"
- android:theme="@style/AppTheme" >
- <activity
- android:name="com.example.multicastsocketreceiver.MainActivity"
- android:label="@string/app_name" >
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- </activity>
- <service android:name=".MultiSocketB" />
- </application>
- </manifest>
- package com.example.multicastsocketreceiver;
- import android.os.Bundle;
- import android.app.Activity;
- import android.content.Intent;
- public class MainActivity extends Activity {
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- Intent intent = new Intent();
- intent.setClass(this, MultiSocketB.class);
- this.startService(intent);
- }
- }
- package com.example.multicastsocketreceiver;
- import java.io.IOException;
- import java.net.DatagramPacket;
- import java.net.InetAddress;
- import java.net.MulticastSocket;
- import android.app.Service;
- import android.content.Intent;
- import android.os.Handler;
- import android.os.HandlerThread;
- import android.os.IBinder;
- import android.util.Log;
- public class MultiSocketB extends Service {
- protected static final String TAG = "MultiSocketB";
- private Handler mHandler;
- @Override
- public IBinder onBind(Intent intent) {
- return null;
- }
- @Override
- public void onCreate() {
- super.onCreate();
- Log.v(TAG, "onCreate");
- // 通过Handler启动线程
- HandlerThread handlerThread = new HandlerThread("MultiSocketB");
- handlerThread.start();
- mHandler = new Handler(handlerThread.getLooper());
- mHandler.post(mRunnable);
- }
- private Runnable mRunnable = new Runnable() {
- public void run() {
- Log.v(TAG, "run...");
- try {
- receiveMultiBroadcast();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- };
- protected void receiveMultiBroadcast() throws IOException {
- Log.v(TAG, "receiveMultiBroadcast...");
- MulticastSocket socket = new MulticastSocket(8601);
- InetAddress address = InetAddress.getByName("224.0.0.1");
- socket.joinGroup(address);
- DatagramPacket packet;
- // 接收数据
- Log.v(TAG, "receiver packet");
- byte[] rev = new byte[512];
- packet = new DatagramPacket(rev, rev.length);
- socket.receive(packet);
- String receiver = new String(packet.getData()).trim(); //不加trim,则会打印出512个byte,后面是乱码
- Log.v(TAG, "get data = " + receiver);
- //发送数据包
- Log.v(TAG, "send packet");
- String process_receiver = "I am MultiSocketB, I got " + receiver;
- byte[] buf = process_receiver.getBytes();
- packet = new DatagramPacket(buf, buf.length, address, 8600);
- socket.send(packet);
- //退出组播
- socket.leaveGroup(address);
- socket.close();
- }
- }
Android MulticastSocket IP组播的更多相关文章
- Android上UDP组播无法接收数据的问题
最近,想做一个跨平台的局域网的文件传输软件,思路是组播设备信息,TCP连接传输文件.于是进行了一次简单的UDP组播测试,发现Android对于UDP组播接收数据的支持即极为有限. 部分代码如下 pac ...
- IP组播技术介绍及实现例子
引 言 近年来,随着Internet的迅速普及和爆炸性发展,在Internet上产生了许多新的应用,其中不少是高带宽的多媒体应用,譬如网 络视频会议.网络音频/视频广播.AOD/VOD.股市行情发布. ...
- IP组播
1 IP组播基础 IP组播技术有效地解决了单点发送.多点接收的问题.组播源只发送一份数据,被传递的信息在距组播源尽可能远的网络节点才开始被复制和分发,并且只发送给需要该信息的接收者. 说明: 本章 ...
- IP组播技术
1 概述 1.1 产生背景 传统的IP通信有两种方式:一种是在源主机与目的主机之间点对点的通信,即单播:另一种是在源主机与同一网段中所有其它主机之间点对多点的通信,即广播.如果要将信息发送给多 ...
- 【知识强化】第四章 网络层 4.7 IP组播
这节课我们来学习一下IP组播. 首先我们来看这样一个问题,IP数据报在网络当中传输的时候,有几种传输方式呢?三种,分别是单播.广播和组播(多播).这个组播呢也叫做多播,它们俩是一个意思.那这个组播是由 ...
- 计算机网络之网络层IP组播(IGMP、组播路由选择协议、组播地址)
文章转自:https://blog.csdn.net/weixin_43914604/article/details/105318560 学习课程:<2019王道考研计算机网络> 学习目的 ...
- Android开发:组播(多播)与广播
近期由于需要编写能够使同一局域网中的Android客户端与PC端进行自动匹配通信功能的程序,学习并试验了JAVA组播与广播的内容,记录一些理解如下: 一.组播(多播) 背景知识:组播使用UDP对一定范 ...
- android multicast 多播(组播)问题
有谁遇到过同样问题的可以探讨下,或者已经解决问题的,能够指导下我 获取组播锁 private InetAddress group; WifiManager wm=(WifiManager ...
- 浅谈Android中的组播(多播)
组播使用UDP对一定范围内的地址发送相同的一组Packet,即一次可以向多个接受者发出信息,其与单播的主要区别是地址的形式.IP协议分配了一定范围的地址空间给多播(多播只能使用这个范围内的IP),IP ...
随机推荐
- HDU 5965 三维dp 或 递推
题意:= =中文题 思路一:比赛时队友想的...然后我赛后想了一下想了个2维dp,但是在转移的时候,貌似出了点小问题...吧?然后就按照队友的思路又写了一遍. 定义dp[i][j][k],表示第i列, ...
- linux centos下安装g++
1.查看是否安装 g++ -v 2.命令直接安装 yum install gcc-c++ 3.提示你找不到g++安装包,执行下面命令 yum install gcc-c++ libstdc++-dev ...
- HTML day01基础总结
1.网页的基本元素 文字.图像与超链接. 2.每一个网页元素通常由开始标记.结束标记,以及在这两个标记中的内容所组成. 3.一般结构 <html> <head> <met ...
- java中对List中对象排序实现
package com.test; import java.util.ArrayList; import java.util.Collections; import java.util.Compara ...
- linux 命令--sed
简介 sed 是一种在线编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓冲区中,称为"模式空间"(pattern space),接着用sed命令处理缓冲区中的内容,处 ...
- linux的学习系列 8---进程管理
当我们运行程序时,Linux会为程序创建一个特殊的环境,该环境包含程序运行需要的所有资源,以保证程序能够独立运行,不受其他程序的干扰.这个特殊的环境就称为进程. 每个 Linux 命令都与系统中的程序 ...
- MVVM的架构设计与团队协作 with StoryBoard
今天写这篇博客是想达到抛砖引玉的作用,想与大家交流一下思想,相互学习,博文中有不足之处还望大家批评指正.本篇博客的内容沿袭以往博客的风格,也是以干货为主,偶尔扯扯咸蛋(哈哈~不好好工作又开始发表博客啦 ...
- 第一章C语言简介及输出函数 上机部分
第一章C语言简介及输出函数 上机1 #include "stdio.h" void main() { printf("南方学院,你好!\n"); printf( ...
- elasticsearch 索引优化
ES索引优化篇主要从两个方面解决问题,一是索引数据过程:二是检索过程. 索引数据过程我在上面几篇文章中有提到怎么创建索引和导入数据,但是大家可能会遇到索引数据比较慢的过程.其实明白索引的原理就可以有 ...
- Python -- OOP高级 -- 元类
type()函数既可以返回一个对象的类型,又可以创建出新的类型 def fn(self, name="world"): print("Hello, %s!" % ...