Невозможно получить пакет UDP на ПК с телефона Android - PullRequest
0 голосов
/ 01 мая 2019

Я пытаюсь установить простое соединение между ПК с сервером Java UDP и телефоном Android с клиентом UDP.Android сообщает, что пакет отправлен, но ПК ничего не получает.

Оба устройства находятся в одной сети, ПК подключен через Ethernet с IP 192.168.56.1, а Android подключен через Wi-Fi.,Размер порта 2050 в обоих из них, а размер буфера 1024 в обоих.Я пытаюсь отправить с телефона Android 4-значный PIN-код, плюс символ # и 4-значный код подтверждения (в данном случае 0001), поэтому сообщение будет примерно таким же, как 2348 # 0001.ПК должен получить пакет и декодировать это сообщение.

Код сервера (ПК) (он остается навсегда при получении):

private boolean connect() throws Exception{
    System.out.println("Waiting for PIN code...");
    String msg;
    byte[] buffer = new byte[BUFFER_SIZE];
    DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
    socket.receive(packet);
    System.out.println("Received packet");
    msg = new String(packet.getData()).trim();
    String[] msgDecoded = msg.split("#");
    clientIP = packet.getAddress();

    if(msgDecoded[0].equals(password) && msgDecoded[1].equals(CONNECTION_ACCEPT_CODE)) return true;
    else return false;
}

Код клиента (телефон Android):

public void establishConnection(View view) throws Exception{

    /* Variable assignments and initializations */
    clientSocket = new DatagramSocket();
    serverIP = ((EditText)findViewById(R.id.ipInput)).getText().toString();
    Log.d("Info", "IP ADDRESS: " + serverIP);
    InetAddress IPAddress = InetAddress.getByName(serverIP);
    final String password = ((EditText) findViewById(R.id.passwordInput)).getText().toString();
    String message = password + "#" + CONNECTION_ACCEPT_CODE;
    data = message.getBytes();
    final DatagramPacket sendPacket = new DatagramPacket(data, data.length, IPAddress, DEFAULT_PORT);

    /* Send the data to the server */
    /* Needs to be done in another thread, otherwise NetworkOnMainThreadException is thrown */
    Thread sendThread = new Thread(new Runnable() {
        @Override
        public void run(){
            try{ clientSocket.send(sendPacket); Log.d("TEST", "Sent" + sendPacket.getData().toString());}
            catch (Exception e){ Log.d("TEST", "EXCEPTION SENDING"); }
        }
    });
    sendThread.start();


    /* Now wait for server ACK */
    receiveData = new byte[BUFFER_SIZE];
    final DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);

    /* Receive data from the server */
    /* Needs to be done in another thread, otherwise NetworkOnMainThreadException is thrown */
    Thread receiveThread = new Thread(new Runnable() {
        @Override
        public void run(){
            try{
                clientSocket.receive(receivePacket);
                Log.d("RECEIVED", receivePacket.getData().toString());
                String ack = new String(receivePacket.getData(), StandardCharsets.UTF_8);
                /* If receive ACK go to next activity */
                if(ack.equals(ACK_ACCEPTED)){
                    Intent intent = new Intent(getApplicationContext(), KeylogActivity.class);
                    intent.putExtra(EXTRA_IPADDR, serverIP);
                    intent.putExtra(EXTRA_PASSWD, password);
                    startActivity(intent);
                }

                /* If we don't, log error */
                // TODO: do actual job here
                else{
                    Log.d("[Error]", "Server rejected the connection: " + ack);
                }

            }
            catch (Exception e) { Log.d("ERROR", "Exception receiving: " + e); }
        }
    });
    receiveThread.start();
}

Похоже, что SendThread работает хорошо, потому что он регистрирует «Отправлено», но не влияет на ПК.Поскольку сервер ПК не принимает сообщения, он также ничего не отправляет, поэтому телефон Android ничего не получает.

1 Ответ

0 голосов
/ 01 мая 2019

Хорошо, проблема в том, что я пытался подключиться к сети VirtualBox только для хоста.Я запустил команду ipconfig на Powershell и увидел мой настоящий IP.Изменение IP-адреса в приложении для соответствия интерфейсу Ethernet решило проблему для меня.

...