У меня на компьютере очень простое приложение для рисования, которое сохраняет точки и рисует овал для каждой точки.
Я пытаюсь отправить это в приложение для 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 и порт?