Android MulticastSocket IP组播
2015-11-15 01:19
375 查看
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();
}
}
我写了一个例子,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中Broadcast&BroadcastReceiver的基础使用
- android 蓝牙通信编程
- Android模拟器与本机通信
- 关于View的文章
- Android Volley源码分析(一) 简要介绍
- Android activity的生命周期
- Android Studio实践运用中遇到问题总结
- Android中实现滑动(拖动)的几种方法,玩转SlideMenu
- 关于android.intent.action.MAIN在manifest里的使用?
- android开发之wheel控件使用详解
- android开发之wheel控件使用详解
- android开发之wheel控件使用详解
- android开发之wheel控件使用详解
- Android 开发获取手机运行内存工具类
- android 下载
- Android调用系统相机拍照及图片保存的Uri方式------菜鸟学习历程
- Android 多线程断点下载project总结
- Android Studio无法利用模板新建Activity与Fragmnet的问题分析与解决
- Android图片旋转,缩放,位移,倾斜,对称完整示例(一)——imageView.setImageMatrix(matrix)和Matrix
- 初学Android项目:开发电子市场<第一天>