0

我正在开发一个安卓应用程序。假设我有 4 个设备(智能手机),其中两个是接入点,并且它们都连接一个设备,显然它们是通过无线连接的。

所以事实是我需要一种将数据从一个子网发送到另一个子网的方法,我尝试使用多播(使用 jmdns 库)但没有成功。

有人可以帮我吗?谢谢。

4

2 回答 2

1

我在没有任何库的情况下使用多播在 pc 和智能手机之间做了类似的事情,只是 Android 和 Java 后端中的 MulticastSocket 类,你试过吗?

于 2015-02-25T21:01:02.670 回答
0
    import java.io.BufferedReader;
    import java.io.ByteArrayInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.net.DatagramPacket;
    import java.net.InetAddress;
    import java.net.MulticastSocket;
    import java.util.concurrent.Executors;
    import java.util.concurrent.ScheduledExecutorService;
    import java.util.concurrent.TimeUnit;

    import com.classes.domain.NetworkProperties;
    import com.classes.domain.Settings;

    public class MulticastSender {

        private static ScheduledExecutorService scheduler = null;

        public static final String MC_ADDRESS = "226.2.2.3";
        public static final int MC_PORT = 8888;
        public static final int MAX_LEN = 1024;

        public static void startExecutor() {

            scheduler = Executors.newScheduledThreadPool(1);

            // remove final and uncomment line above if you wanna force automatic
            // start
            // final Runnable multicastServer = new Runnable() {
            Runnable multicastServer = new Runnable() {
                @Override
                public void run() {
                    multicastSender();
                }
            };

            scheduler.scheduleAtFixedRate(multicastServer, 0, 10, TimeUnit.SECONDS);
        }

        public static void multicastSender() {
            MulticastSocket socket = null;
            InetAddress address = null;
            InputStream is = null;
            BufferedReader br = null;
            int ttl = 1;
            String sendData = null;
            byte[] sendBytes = null;

            try {
                socket = new MulticastSocket();
                socket.setTimeToLive(ttl);

                address = InetAddress.getByName(MC_ADDRESS);

                NetworkProperties.retrieveNetworkProperties();
                String ip = NetworkProperties.localIPv4Address;
                int port = NetworkProperties.applicationPort;

                sendData = ip + "-" + port;
                is = new ByteArrayInputStream(sendData.getBytes());
                br = new BufferedReader(new InputStreamReader(is));

                while ((sendData = br.readLine()) != null) {

                    sendBytes = sendData.getBytes();

                    DatagramPacket packet = new DatagramPacket(sendBytes, sendBytes.length, address, MC_PORT);
                    socket.send(packet);

                }

                socket.close();

            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }

    }



package com.classes.domain;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
import java.sql.SQLException;

import android.content.Context;
import android.net.wifi.WifiManager;

public class MulticastReceiver {

    public static final String MC_ADDRESS = "226.2.2.3";
    public static final int MC_PORT = 8888;
    public static final int MAX_LEN = 1024;

    public static void multicastReceiver(Context context) {

        MulticastSocket socket = null;
        DatagramPacket packet = null;
        InetAddress address = null;
        WifiManager.MulticastLock lock = null;

        WifiManager wifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
        if (wifi != null) {
            lock = wifi.createMulticastLock("AllowMulticast");
            lock.acquire();
        }

        try {
            socket = new MulticastSocket(MC_PORT);
            socket.setReuseAddress(true);

            address = InetAddress.getByName(MC_ADDRESS);
            socket.joinGroup(address);

            while (true) {

                byte[] buf = new byte[MAX_LEN];
                packet = new DatagramPacket(buf, buf.length);

                socket.receive(packet);

                String msg = new String(buf, 0, packet.getLength());
//              System.out.println("From " + packet.getAddress() + " Msg : "
//                      + msg);
//              System.out.println("Received " + packet.getLength()
//                      + " bytes from " + packet.getAddress() + ": "
//                      + new String(packet.getData(), 0, packet.getLength()));

                String temp = msg;

/*
REPLACE THIS PART WITH RECEIVED DATA DO WHAT YOU NEED
                if (temp.indexOf("-") != -1) {
                    String[] result = temp.split("-");
                    String ip = result[0];
                    String port = result[1];


                    Settings settings = Settings.loadSettings(context);
                    settings.setIP(ip);
                    settings.setPort(Integer.parseInt(port));
                    try {
                        settings.Save(context);
                    } catch (SQLException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }

                }
*/

                break;
            }

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        try {
            socket.leaveGroup(address);
            socket.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        if (lock.isHeld()) {
            lock.release();
            lock = null;
        }

    }

}
于 2015-02-26T15:40:25.963 回答