Android: производительность TCP-соединения - PullRequest
2 голосов
/ 04 января 2012

У меня есть сервер ПК и Android-клиент;Мой Android-клиент запускает сокет-соединение с сервером.

Пока я подключен к серверу, я также получаю данные с сервера на Android-клиент;

Вот мой код:

Socket socket = null;
DataOutputStream out = null;
DataInputStream in = null;
InputStream inputStream = null; 
OutputStream outputStream = null;
...

public void connectToTCP()
        {

            try
            {   
               socket = new Socket(HOST_ADDRESS, PORT);

                socket.setSoTimeout(30000);
                outputStream = socket.getOutputStream();
                out = new DataOutputStream(outputStream);
                inputStream = socket.getInputStream();
                in = new DataInputStream(inputStream);

                Log.e("TCP-", "Connected");

               while (socket.isConnected()){readBytes();}
            } 
            catch (UnknownHostException e) 
            {

               Log.e("Error in tcp connection","Unknown Host");

            }
            catch (IOException e) 
            {

                Log.e("Error in tcp connection", "Couldn't get I/O for the connection");

            }
        }

    public void readBytes() throws IOException
        {   
            if (in.available() > 0)
            {
                byte[] buffer = new byte[in.available()];
                if (buffer.length > 0)
                {
                    if (mListener != null)
                    {
                        int numberOfBytes = in.read(buffer);
                        mListener.tcpConnectionDataReceived(buffer, numberOfBytes);
                    }
                }
            }
        }

но моя проблема в производительности.Я протестировал код на устройстве и заметил (из диспетчера задач), что приложение потребляет много ресурсов (загрузка ЦП превышает 50%), но когда я прекращаю чтение из сокета, удаляя его, пока цикл while (socket.isConnected()){readBytes();} Использование ЦП становитсяменее 1%.

Есть идеи, чтобы решить эту проблему?

Ответы [ 2 ]

4 голосов
/ 04 января 2012

Вы readBytes() метод вернетесь немедленно, если данные недоступны. Поскольку он находится в тесном цикле, вы, по сути, постоянно проверяете, есть ли что-то доступное, тратя много ресурсов процессора.

С кодом, который вы показываете, вам было бы лучше сделать простое блокирующее чтение (то есть убрать проверку available() в целом и использовать разумный буфер фиксированного размера).

2 голосов
/ 04 января 2012

Вы должны спать между вызовами на readBytes() - вы в основном создали бесконечный цикл, если данные недоступны и, таким образом, in.available() > 0 ложно.

Или, если это в его собственной фоновой цепочке, простоблокировка чтения, когда вы знаете, что ожидается больше данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...