Android: непрерывная запись в сокет - PullRequest
1 голос
/ 06 февраля 2012

Я новичок в программировании на Java и Android, но есть проект, который требует от меня этого.

Приложение отправляет байты на сервер, который получает всю информацию, отправляемую ему, и выполняет эквивалентные команды.Клиент и сервер находятся в эксклюзивной ссылке, поэтому я не буду беспокоиться о проблемах безопасности.

public class NetworkTask extends AsyncTask<Void, byte[], Boolean> {
    OutputStream dataOut; //Network Output Stream

    @Override
    protected void onPreExecute() {
        Log.i("AsyncTask", "onPreExecute");
    }

    @Override
    protected Boolean doInBackground(Void... params) {

        boolean result = false;

        while (sendData) { //While Boolean sendData is true

            try {
                gsocket = new Socket(roubotIP, roubotPort);

                byte[] data = EncodingUtils.getAsciiBytes(outData);

                Log.i("Data: ", outData);
                dataOut = new DataOutputStream(gsocket.getOutputStream());

                dataOut.write(data);

            } catch (UnknownHostException e) {
                Log.i("Socket: ","Unkown host");
                e.printStackTrace();
                result = true;
            } catch (IOException e) {
                e.printStackTrace();
                result = true;
            } catch (Exception e) {
                e.printStackTrace();
                result = true;
            }
        }

        try {
            dataOut.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

        return result;
    }
}

С помощью приведенного выше кода мне удалось установить соединение с сервером, но данные только отправляются / записываются наРазъем каждые 1-2 секунды.

Есть ли способ выполнять это постоянно?или с минимальной задержкой (около 0,5 секунды или меньше?)

Срок службы батареи для меня не проблема, и я согласен, что у активного разъема есть свои недостатки.

Спасибо.

1 Ответ

3 голосов
/ 05 октября 2012
  1. вы создаете несколько сокетов в блоке while
  2. по второй ссылке вы также создаете несколько выходных потоков в блоке while

Попробуйте сделать это так:

public class NetworkTask extends AsyncTask<Void, byte[], Boolean> {
    OutputStream dataOut; //Network Output Stream

    @Override
    protected void onPreExecute() {
        Log.i("AsyncTask", "onPreExecute");
    }

    @Override
    protected Boolean doInBackground(Void... params) {
        try {
            gsocket = new Socket(roubotIP, roubotPort);
            dataOut = new DataOutputStream(gsocket.getOutputStream());
        } catch (UnknownHostException e) {
            Log.i("Socket: ","Unkown host");
            e.printStackTrace();
            return false;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
        while (sendData) { //While Boolean sendData is true
            try {
                byte[] data = EncodingUtils.getAsciiBytes(outData);
                Log.i("Data: ", outData);
                dataOut.write(data);
                dataOut.flush();
            } catch (Exception e) {
                e.printStackTrace();
                return false;
            }
        }
        try {
            socket.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return true;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...