Я написал базовый клиентский сервер udp, где один android отправляет сообщение серверу, а сервер передает его остальным клиентам.Android может отправить udp, но не получать
Проблема заключается в том, что входящие сообщения udp попадают на сервер, а сервер передает их обратно, но они никогда не доходят до остальных устройств.
Что действительно удивительно в том, что если я использую сервер в качестве сервера эхо-сигналов (например, для передачи только отправителю), тогда все работает. Все гнезда клиента и сервера использовать тот же порт 2706
Серверный код
while (true) {
DatagramPacket packetToReceive = new DatagramPacket(new byte[2048], 2048);
try {
listenerSocket.receive(packetToReceive);
InetAddress senderAddress = packetToReceive.getAddress();
relayedBytes += packetToReceive.getLength();
if (!connectedClients.contains(senderAddress)) {
connectedClients.add(senderAddress);
}
for (InetAddress addr : connectedClients) {
// commenting this line will make it an echo server
if (!addr.equals(senderAddress))
{
//The following actually prints the ips of the android
//devices so it knows where to send
System.out.println(senderAddress.getHostAddress().toString() +
" to " + addr.getHostAddress().toString());
byte[] data = packetToReceive.getData();
packetToReceive.setData(data, 0, packetToReceive.getLength());
packetToReceive.setAddress(addr);
listenerSocket.send(packetToReceive);
}
}
} catch (IOException) {
e.printStackTrace();
}
}
андроида логика отправитель:
mainSocket=new DatagramSocket(homePort);
//targetAddressString is the public IP of server
target = InetAddress.getByName(targetAddressString);
while (true) {
byte[] data = getdata();
if (data == null)
continue;
DatagramPacket packet = new DatagramPacket(data, data.length, target, targetPort);
mainSocket.send(packet);
}
тем временем на другом потоке, приемник просто ждет с таким же UdP гнездо:
while (true) {
Log.d("Player", "Waiting for data");
DatagramPacket packet = new DatagramPacket(new byte[2048], 2048);
try {
mainSocket.receive(packet);
Log.d("Player", "packet received");
//do something with the packet
} catch (IOException e) {
e.printStackTrace();
}
}
Он никогда не двигается дальше, чем ожидает данных, так как он будет блокироваться до тех пор, ceives пакет,
Кроме того, я могу также увидеть его в Wi-Fi и мобильных иконками данных, что никакие данные не когда-либо получал, но данные отправка всегда и считается полученным на сервере
** EDIT: - Echo сервер **
while (true) {
DatagramPacket receivedPacket = new DatagramPacket(new byte[2048], 2048);
try {
listenerSocket.receive(receivedPacket);
InetAddress senderAddress = receivedPacket.getAddress();
if (!connectedClients.contains(senderAddress)) {
connectedClients.add(senderAddress);
}
for (InetAddress addr : connectedClients) {
byte[] data = receivedPacket.getData();
DatagramPacket sendPacket= new DatagramPacket(data, 0, receivedPacket.getLength(), addr, receivedPacket.getPort());
listenerSocket.send(sendPacket);
}
} catch (IOException e) {
// ...
}
}
в основном он должен передать сообщение для каждого клиента, который когда-либо посланного какие-либо данные, но как-то он посылает только его своему исходному отправителю остальную часть клиентов пропустить. код троллинг со мной
Здесь что-то действительно магическое, я упростил сервер, чтобы просто потушить данные от одного клиента каждому в связанном клиенте. Тем не менее, только тот, кто первоначально отправил пакет, может вернуть его обратно. Думаю, я сделал очень глупую ошибку. – Allahjane
Можете ли вы опубликовать код сервера как эхо-сервер, который работает? Это может дать нам необходимую информацию для ответа. –
@ AlainO'Dea уверен, пожалуйста, см. Ediit – Allahjane