• Android MulticastSocket IP组播


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

    再看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.   
    8.     <uses-sdk  
    9.         android:minSdkVersion="8"  
    10.         android:targetSdkVersion="17" />  
    11.   
    12.     <application  
    13.         android:allowBackup="true"  
    14.         android:icon="@drawable/ic_launcher"  
    15.         android:label="@string/app_name"  
    16.         android:theme="@style/AppTheme" >  
    17.         <activity  
    18.             android:name="com.example.multicastsocketreceiver.MainActivity"  
    19.             android:label="@string/app_name" >  
    20.             <intent-filter>  
    21.                 <action android:name="android.intent.action.MAIN" />  
    22.   
    23.                 <category android:name="android.intent.category.LAUNCHER" />  
    24.             </intent-filter>  
    25.         </activity>  
    26.           
    27.         <service android:name=".MultiSocketB" />  
    28.           
    29.     </application>  
    30.   
    31. </manifest>  
     
    1. package com.example.multicastsocketreceiver;  
    2.   
    3. import android.os.Bundle;  
    4. import android.app.Activity;  
    5. import android.content.Intent;  
    6.   
    7. public class MainActivity extends Activity {  
    8.   
    9.     @Override  
    10.     protected void onCreate(Bundle savedInstanceState) {  
    11.         super.onCreate(savedInstanceState);  
    12.         setContentView(R.layout.activity_main);  
    13.           
    14.         Intent intent = new Intent();  
    15.         intent.setClass(this, MultiSocketB.class);  
    16.         this.startService(intent);  
    17.     }  
    18.   
    19. }  
     
    1. package com.example.multicastsocketreceiver;  
    2.   
    3. import java.io.IOException;  
    4. import java.net.DatagramPacket;  
    5. import java.net.InetAddress;  
    6. import java.net.MulticastSocket;  
    7. import android.app.Service;  
    8. import android.content.Intent;  
    9. import android.os.Handler;  
    10. import android.os.HandlerThread;  
    11. import android.os.IBinder;  
    12. import android.util.Log;  
    13.   
    14. public class MultiSocketB extends Service {  
    15.     protected static final String TAG = "MultiSocketB";  
    16.     private Handler mHandler;  
    17.   
    18.     @Override  
    19.     public IBinder onBind(Intent intent) {  
    20.         return null;  
    21.     }  
    22.   
    23.     @Override  
    24.     public void onCreate() {  
    25.         super.onCreate();  
    26.         Log.v(TAG, "onCreate");  
    27.         // 通过Handler启动线程  
    28.         HandlerThread handlerThread = new HandlerThread("MultiSocketB");  
    29.         handlerThread.start();  
    30.         mHandler = new Handler(handlerThread.getLooper());  
    31.         mHandler.post(mRunnable);  
    32.     }  
    33.   
    34.     private Runnable mRunnable = new Runnable() {  
    35.         public void run() {  
    36.             Log.v(TAG, "run...");  
    37.             try {  
    38.                 receiveMultiBroadcast();  
    39.             } catch (Exception e) {  
    40.                 e.printStackTrace();  
    41.             }  
    42.         }  
    43.   
    44.     };  
    45.   
    46.     protected void receiveMultiBroadcast() throws IOException {  
    47.         Log.v(TAG, "receiveMultiBroadcast...");  
    48.         MulticastSocket socket = new MulticastSocket(8601);  
    49.         InetAddress address = InetAddress.getByName("224.0.0.1");  
    50.         socket.joinGroup(address);  
    51.   
    52.         DatagramPacket packet;  
    53.   
    54.         // 接收数据  
    55.         Log.v(TAG, "receiver packet");  
    56.         byte[] rev = new byte[512];  
    57.         packet = new DatagramPacket(rev, rev.length);  
    58.         socket.receive(packet);  
    59.         String receiver = new String(packet.getData()).trim();  //不加trim,则会打印出512个byte,后面是乱码  
    60.         Log.v(TAG, "get data = " + receiver);  
    61.   
    62.         //发送数据包  
    63.         Log.v(TAG, "send packet");  
    64.         String process_receiver = "I am MultiSocketB, I got " + receiver;  
    65.         byte[] buf = process_receiver.getBytes();  
    66.         packet = new DatagramPacket(buf, buf.length, address, 8600);  
    67.         socket.send(packet);  
    68.           
    69.         //退出组播  
    70.         socket.leaveGroup(address);  
    71.         socket.close();  
    72.     }  
    73.   
    74. }  
  • 相关阅读:
    CMake 手册详解(十九)
    CMake 手册详解(二十三)
    CMake 手册详解(二十)
    xtrabackupex xbstream 流备份还原(转载)
    xtrabackup 安装与使用(转载)
    怎么样写好一篇技术博客
    python为什么需要符号表
    cmake的一些基本概念及源码结构
    让IT工作者过劳的13个坏习惯
    SHTML和HTML的区别
  • 原文地址:https://www.cnblogs.com/senior-engineer/p/4966020.html
Copyright © 2020-2023  润新知