MulticastSocket是对等的关系,也就是他们通过IP多点组播保留的地址来相互接收在这个组的Socket发送的消息

我写了一个例子,MultiSocketB是一个service,用于先接收再发送,MultiSocketA用于先发送再接收,完成这一动作后退出

记得要加使用网络的权限

  1. <uses-permission android:name="android.permission.INTERNET" />

先看MultiSocketA

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3. package="com.example.multicastsocketsend"
  4. android:versionCode="1"
  5. android:versionName="1.0" >
  6. <uses-permission android:name="android.permission.INTERNET" />
  7. <uses-sdk
  8. android:minSdkVersion="8"
  9. android:targetSdkVersion="17" />
  10. <application
  11. android:allowBackup="true"
  12. android:icon="@drawable/ic_launcher"
  13. android:label="@string/app_name"
  14. android:theme="@style/AppTheme" >
  15. <activity
  16. android:name="com.example.multicastsocketsend.MultiSocketA"
  17. android:label="@string/app_name" >
  18. <intent-filter>
  19. <action android:name="android.intent.action.MAIN" />
  20. <category android:name="android.intent.category.LAUNCHER" />
  21. </intent-filter>
  22. </activity>
  23. </application>
  24. </manifest>
  1. package com.example.multicastsocketsend;
  2. import java.io.IOException;
  3. import java.net.DatagramPacket;
  4. import java.net.InetAddress;
  5. import java.net.MulticastSocket;
  6. import android.app.Activity;
  7. import android.os.Bundle;
  8. import android.os.Handler;
  9. import android.os.HandlerThread;
  10. import android.util.Log;
  11. /**
  12. * @author lijinwei
  13. * 本应用用于实现IP多点广播
  14. * 若要使用多点广播时,则需要让一个数据报标有一组目标主机地址,当数据报发出后,整个组的所有主机都能收到该数据报。
  15. * IP多点广播(或多点发送)实现了将单一信息发送到多个接收者的广播,其思想是设置一组特殊网络地址作为多点广播地址,每一个多点广播地址都被看做一个组,
  16. * 当客户端需要发送、接收广播信息时,加入到该组即可。
  17. */
  18. public class MultiSocketA extends Activity {
  19. protected static final String TAG = "MultiSocketA";
  20. private Handler mHandler;
  21. @Override
  22. protected void onCreate(Bundle savedInstanceState) {
  23. super.onCreate(savedInstanceState);
  24. setContentView(R.layout.activity_main);
  25. //通过Handler启动线程
  26. HandlerThread handlerThread = new HandlerThread("MultiSocketA");
  27. handlerThread.start();
  28. mHandler =  new Handler(handlerThread.getLooper());
  29. mHandler.post(mRunnable);
  30. }
  31. private Runnable mRunnable = new Runnable() {
  32. public void run() {
  33. Log.v(TAG, "run...");
  34. try {
  35. sendMultiBroadcast();
  36. } catch (Exception e) {
  37. e.printStackTrace();
  38. }
  39. }
  40. private void sendMultiBroadcast() throws IOException {
  41. Log.v(TAG, "sendMultiBroadcast...");
  42. /*
  43. * 实现多点广播时,MulticastSocket类是实现这一功能的关键,当MulticastSocket把一个DatagramPacket发送到多点广播IP地址,
  44. * 该数据报将被自动广播到加入该地址的所有MulticastSocketMulticastSocket类既可以将数据报发送到多点广播地址,
  45. * 也可以接收其他主机的广播信息
  46. */
  47. MulticastSocket socket = new MulticastSocket(8600);
  48. //IP协议为多点广播提供了这批特殊的IP地址,这些IP地址的范围是224.0.0.0至239.255.255.255
  49. InetAddress address = InetAddress.getByName("224.0.0.1");
  50. /*
  51. * 创建一个MulticastSocket对象后,还需要将该MulticastSocket加入到指定的多点广播地址,
  52. MulticastSocket使用jionGroup()方法来加入指定组;使用leaveGroup()方法脱离一个组。
  53. */
  54. socket.joinGroup(address);
  55. /*
  56. * 在某些系统中,可能有多个网络接口。这可能会对多点广播带来问题,这时候程序需要在一个指定的网络接口上监听,
  57. * 通过调用setInterface可选择MulticastSocket所使用的网络接口;
  58. * 也可以使用getInterface方法查询MulticastSocket监听的网络接口。
  59. */
  60. //socket.setInterface(address);
  61. DatagramPacket packet;
  62. //发送数据包
  63. Log.v(TAG, "send packet");
  64. byte[] buf = "Hello I am MultiSocketA".getBytes();
  65. packet = new DatagramPacket(buf, buf.length, address, 8601);
  66. socket.send(packet);
  67. //接收数据
  68. Log.v(TAG, "receiver packet");
  69. byte[] rev = new byte[512];
  70. packet = new DatagramPacket(rev, rev.length);
  71. socket.receive(packet);
  72. Log.v(TAG, "get data = " + new String(packet.getData()).trim());    //不加trim,则会打印出512个byte,后面是乱码
  73. //退出组播
  74. socket.leaveGroup(address);
  75. socket.close();
  76. }
  77. };
  78. }

再看MultiSocketB

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3. package="com.example.multicastsocketreceiver"
  4. android:versionCode="1"
  5. android:versionName="1.0" >
  6. <uses-permission android:name="android.permission.INTERNET" />
  7. <uses-sdk
  8. android:minSdkVersion="8"
  9. android:targetSdkVersion="17" />
  10. <application
  11. android:allowBackup="true"
  12. android:icon="@drawable/ic_launcher"
  13. android:label="@string/app_name"
  14. android:theme="@style/AppTheme" >
  15. <activity
  16. android:name="com.example.multicastsocketreceiver.MainActivity"
  17. android:label="@string/app_name" >
  18. <intent-filter>
  19. <action android:name="android.intent.action.MAIN" />
  20. <category android:name="android.intent.category.LAUNCHER" />
  21. </intent-filter>
  22. </activity>
  23. <service android:name=".MultiSocketB" />
  24. </application>
  25. </manifest>
  1. package com.example.multicastsocketreceiver;
  2. import android.os.Bundle;
  3. import android.app.Activity;
  4. import android.content.Intent;
  5. public class MainActivity extends Activity {
  6. @Override
  7. protected void onCreate(Bundle savedInstanceState) {
  8. super.onCreate(savedInstanceState);
  9. setContentView(R.layout.activity_main);
  10. Intent intent = new Intent();
  11. intent.setClass(this, MultiSocketB.class);
  12. this.startService(intent);
  13. }
  14. }
  1. package com.example.multicastsocketreceiver;
  2. import java.io.IOException;
  3. import java.net.DatagramPacket;
  4. import java.net.InetAddress;
  5. import java.net.MulticastSocket;
  6. import android.app.Service;
  7. import android.content.Intent;
  8. import android.os.Handler;
  9. import android.os.HandlerThread;
  10. import android.os.IBinder;
  11. import android.util.Log;
  12. public class MultiSocketB extends Service {
  13. protected static final String TAG = "MultiSocketB";
  14. private Handler mHandler;
  15. @Override
  16. public IBinder onBind(Intent intent) {
  17. return null;
  18. }
  19. @Override
  20. public void onCreate() {
  21. super.onCreate();
  22. Log.v(TAG, "onCreate");
  23. // 通过Handler启动线程
  24. HandlerThread handlerThread = new HandlerThread("MultiSocketB");
  25. handlerThread.start();
  26. mHandler = new Handler(handlerThread.getLooper());
  27. mHandler.post(mRunnable);
  28. }
  29. private Runnable mRunnable = new Runnable() {
  30. public void run() {
  31. Log.v(TAG, "run...");
  32. try {
  33. receiveMultiBroadcast();
  34. } catch (Exception e) {
  35. e.printStackTrace();
  36. }
  37. }
  38. };
  39. protected void receiveMultiBroadcast() throws IOException {
  40. Log.v(TAG, "receiveMultiBroadcast...");
  41. MulticastSocket socket = new MulticastSocket(8601);
  42. InetAddress address = InetAddress.getByName("224.0.0.1");
  43. socket.joinGroup(address);
  44. DatagramPacket packet;
  45. // 接收数据
  46. Log.v(TAG, "receiver packet");
  47. byte[] rev = new byte[512];
  48. packet = new DatagramPacket(rev, rev.length);
  49. socket.receive(packet);
  50. String receiver = new String(packet.getData()).trim();  //不加trim,则会打印出512个byte,后面是乱码
  51. Log.v(TAG, "get data = " + receiver);
  52. //发送数据包
  53. Log.v(TAG, "send packet");
  54. String process_receiver = "I am MultiSocketB, I got " + receiver;
  55. byte[] buf = process_receiver.getBytes();
  56. packet = new DatagramPacket(buf, buf.length, address, 8600);
  57. socket.send(packet);
  58. //退出组播
  59. socket.leaveGroup(address);
  60. socket.close();
  61. }
  62. }

Android MulticastSocket IP组播的更多相关文章

  1. Android上UDP组播无法接收数据的问题

    最近,想做一个跨平台的局域网的文件传输软件,思路是组播设备信息,TCP连接传输文件.于是进行了一次简单的UDP组播测试,发现Android对于UDP组播接收数据的支持即极为有限. 部分代码如下 pac ...

  2. IP组播技术介绍及实现例子

    引 言 近年来,随着Internet的迅速普及和爆炸性发展,在Internet上产生了许多新的应用,其中不少是高带宽的多媒体应用,譬如网 络视频会议.网络音频/视频广播.AOD/VOD.股市行情发布. ...

  3. IP组播

    1  IP组播基础 IP组播技术有效地解决了单点发送.多点接收的问题.组播源只发送一份数据,被传递的信息在距组播源尽可能远的网络节点才开始被复制和分发,并且只发送给需要该信息的接收者.  说明: 本章 ...

  4. IP组播技术

      1  概述 1.1  产生背景 传统的IP通信有两种方式:一种是在源主机与目的主机之间点对点的通信,即单播:另一种是在源主机与同一网段中所有其它主机之间点对多点的通信,即广播.如果要将信息发送给多 ...

  5. 【知识强化】第四章 网络层 4.7 IP组播

    这节课我们来学习一下IP组播. 首先我们来看这样一个问题,IP数据报在网络当中传输的时候,有几种传输方式呢?三种,分别是单播.广播和组播(多播).这个组播呢也叫做多播,它们俩是一个意思.那这个组播是由 ...

  6. 计算机网络之网络层IP组播(IGMP、组播路由选择协议、组播地址)

    文章转自:https://blog.csdn.net/weixin_43914604/article/details/105318560 学习课程:<2019王道考研计算机网络> 学习目的 ...

  7. Android开发:组播(多播)与广播

    近期由于需要编写能够使同一局域网中的Android客户端与PC端进行自动匹配通信功能的程序,学习并试验了JAVA组播与广播的内容,记录一些理解如下: 一.组播(多播) 背景知识:组播使用UDP对一定范 ...

  8. android multicast 多播(组播)问题

    有谁遇到过同样问题的可以探讨下,或者已经解决问题的,能够指导下我    获取组播锁 private  InetAddress   group; WifiManager  wm=(WifiManager ...

  9. 浅谈Android中的组播(多播)

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

随机推荐

  1. 在Linux下编写php扩展

    以下内容是本人学习过程中的笔记或者心得,如果有什么建议或者意见请在评论中提醒我,谢谢,这篇文章我会定期更新,由浅到深的分享我学PHP扩展历程 或者在学习中有什么问题欢迎交流 1.去PHP官网下载一个源 ...

  2. mongodb分片

    在系统早期,数据量还小的时候不会引起太大的问题,但是随着数据量持续增多,后续迟早会出现一台机器硬件瓶颈问题的.而mongodb主打的就是海量数据架构,他不能解决海量数据怎么行!不行!“分片”就用这个来 ...

  3. pci 相关资料

    1.http://www.cnblogs.com/image-eye/archive/2012/02/15/2352699.html

  4. docker certificates

    x509: certificate is valid for mmtrkjy.com, *.mmtrkjy.com, *.mmtrkmc.com, *.mmtrkpd.com, *.mmtrksg.c ...

  5. ActiveMQ-CPP编译

    1.activemq-cpp下载地址: http://activemq.apache.org/cms/download.html 2.相关依赖库 http://mirrors.hust.edu.cn/ ...

  6. 设置UITabBarController上ImageInsets后点击不断缩小

    最近遇到了这样一个情况,客户要求做出这种效果的UITabBarController. 通过各种查询,得出UITabBarController有这样一个属性,是设置它的图片距上下左右距离的属性: nav ...

  7. Bitmap与Matrix旋转ImageView

    Bitmap与Matrix旋转ImageView 标签: matrixfloatbutton测试importlayout 2010-08-23 22:18 8569人阅读 评论(0) 收藏 举报  分 ...

  8. 编译hadoop2.4

    摘自 http://www.aboutyun.com/thread-8130-1-1.html.http://www.dataguru.cn/forum.php?mod=viewthread& ...

  9. HBase Coprocessor 剖析与编程实践(转载http://www.cnblogs.com/ventlam/archive/2012/10/30/2747024.html)

    HBase Coprocessor 剖析与编程实践 1.起因(Why HBase  Coprocessor) HBase作为列族数据库最经常被人诟病的特性包括:无法轻易建立“二级索引”,难以执行求和. ...

  10. HDU1372:Knight Moves(BFS)

    Knight Moves Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total ...