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;
-
- 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);
-
- 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 socket = new MulticastSocket(8600);
-
- InetAddress address = InetAddress.getByName("224.0.0.1");
-
- socket.joinGroup(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());
-
-
- 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");
-
- 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();
- 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组播
原文:http://www.cnblogs.com/senior-engineer/p/4966020.html