Как я могу получать многоадресные сообщения на Android? - PullRequest
2 голосов
/ 18 сентября 2011

У меня на компьютере очень простое приложение для рисования, которое сохраняет точки и рисует овал для каждой точки.

Я пытаюсь отправить это в приложение для Android, которое будет получать координаты для каждой точки, а затем рисовать овалы.

Сейчас я использую многоадресные сокеты, но, похоже, это не работает. Боюсь, я что-то упустил.

InetAddress и порт в обоих приложениях одинаковы: 234.235.236.237 и 9876

В моем приложении для ПК код инициализации MultiCastSocket выглядит следующим образом:

private void InitiateSocket() throws IOException
{
    //  Create a socket and start the communication
socket = new MulticastSocket(port);
iAddr = InetAddress.getByName("234.235.236.237");

    //  Joins the multicastSocket group
socket.joinGroup(iAddr);
} 

И когда я хочу отправить координату, я вызываю этот метод:

public void SendMessage(int x, int y)
{

    //Translate message to bytes
byte[] _data = (x+ " " + y).getBytes();

    //Create and send a packet
DatagramPacket _packet = new DatagramPacket(_data, _data.length, iAddr, port);

    try {
        socket.send(_packet);
        textArea.append(x + " " + y + " ");
    } catch (IOException e) {
        System.exit(0);
    }
} 

Тогда мое Android-приложение выглядит так:

WifiManager wm = (WifiManager)getSystemService(Context.WIFI_SERVICE);
WifiManager.MulticastLock multicastLock = wm.createMulticastLock("mydebuginfo");
multicastLock.acquire();


//Create a socket and start the communication
_socket = new MulticastSocket(_port);

//    Joins the multicastSocket group
_socket.joinGroup(_iadr);

//    Add a new Client to the socket
new Client(_socket, this);

Когда я хочу отправить сообщение, я вызываю его, что очень похоже на то, что указано в приложении на ПК

    private void SendMessage(String _s)
{
    //    Translate message to bytes
    byte[] _data = (_name + ": "+ _s).getBytes();

    //    Create and send a packet
    DatagramPacket _packet = new DatagramPacket(_data, _data.length, _iadr, _port);

    try {
        _socket.send(_packet);
    } catch (IOException e) {
        _field.append(e.toString());
    }
}

Затем класс Client прослушивает сокет с таким кодом:

@Override
public void run() {

    byte[] _data = new byte[1024];
    while(true)
    {
        try
        {
            //Datagram for receiving
            DatagramPacket packet = new DatagramPacket(_data, _data.length);

            //Receive the packet, convert it and send it to the Activity class
            _socket.receive(packet);
            String _medd = new String(_data, 0 , packet.getLength());
            _csta.input = _medd;
        }
        catch(IOException e)
        {
            //Will break when the socket is closed
            break;
        } 
    }
}

Дело в том, что я получаю свои собственные сообщения, отправленные из приложения Android, но я не получаю сообщения, отправленные с ПК. Поэтому я предполагаю, что это как-то связано с подключением.

Я установил android.permission.CHANGE_WIFI_MULTICAST_STATE и android.permission.INTERNET в AndroidManifest.

Надеюсь, предоставленной мной информации достаточно.

Я использую эмулятор и андроид 2.2.

Не по теме: Я не очень понимаю, как работают MulticastSockets, как я могу просто выбрать IP класса D и порт?

1 Ответ

0 голосов
/ 28 июня 2013

Похоже, что эмулятор не поддерживает многоадресную рассылку:

https://stackoverflow.com/a/3179939/1686442

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...