UDP связь между двумя устройствами Android: как реагировать - PullRequest
0 голосов
/ 05 апреля 2019

Я работаю над приложением, которое позволит пользователям общаться друг с другом, если они подключены к одной сети.У меня есть класс udp_server и метод клиента sendMessage.Проблема в том, что когда клиент отправляет сообщение на сервер (метод sendMessage), сервер правильно его читает, но когда сервер отправляет ответ, отображается тост с отправленным сообщением - это означает, что ответ был отправлен, но клиент не получил его.попробуйте блок catc и не поймайте никаких исключений.

класс udp_server:

private class MyDatagramReceiver extends Thread {
        private boolean bKeepRunning = true;
        private String lastMessage = "";

        public void run() {
            String message;
            byte[] lmessage = new byte[1024*512];
            final DatagramPacket packet = new DatagramPacket(lmessage, lmessage.length);
            try {
                final DatagramSocket socket = new DatagramSocket(11234);
                while(bKeepRunning) {
                    socket.receive(packet);
                    message = new String(lmessage, 0, packet.getLength());
                    lastMessage = message;
                    runOnUiThread(updateTextMessage);

                    byte[] response = "response".getBytes();
                    final DatagramPacket response_packet = new DatagramPacket(response,response.length,InetAddress.getByName("192.168.8.111"),11234);
                    socket.send(response_packet);
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {                                Toast.makeText(getApplicationContext(),"sended",Toast.LENGTH_LONG).show();
                        }
                    });
                }
            } catch (final Throwable e) {                 
                e.printStackTrace();
            }
        }
        public void kill() {
            bKeepRunning = false;
        }
        public String getLastMessage() {
            return lastMessage;
        }
    }

    private Runnable updateTextMessage = new Runnable() {
        public void run() {
            Toast.makeText(getApplicationContext(),"recived",Toast.LENGTH_LONG).show();
            if (myDatagramReceiver == null) return;
                adapter.add(myDatagramReceiver.getLastMessage());
        }
    }

метод отправки сообщения клиентом:

 private void sendMessage(final String message) {
        Thread thread = new Thread(new Runnable() {

            String stringData;

            @Override
            public void run() {
                DatagramSocket ds = null;
                try {
                    ds = new DatagramSocket();                      
                    InetAddress serverAddr = InetAddress.getByName("192.168.8.188");
                    DatagramPacket dp;
                    dp = new DatagramPacket(message.getBytes(), message.length(), serverAddr, 11234);
                    ds.send(dp);
                    byte[] lMsg = new byte[1000];
                    dp = new DatagramPacket(lMsg, lMsg.length);
                    ds.receive(dp);
                    stringData = new String(lMsg, 0, dp.getLength());

                } catch (final IOException e) {
                    e.printStackTrace();                      
                } finally {
                    if (ds != null) {
                        ds.close();
                    }
                }
            }
        });
        thread.start();
    }

Кто-нибудь знает, что происходит?там?

Решено: Я поместил полученную часть кода в методе sendMessage в цикл while, например:

boolean keepWaiting = true;
while(keepWaiting) {
    ds.receive(packet);
    stringData = new String(lMsg, 0, packet.getLength());
    runOnUiThread(respone); //there I analize response
    keepWaiting = false;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...