TCP-сокет клиента висит на сокете сервера - PullRequest
0 голосов
/ 14 февраля 2019

Я разрабатываю программу сокетов TCP / IP для соединения моего телефона Android с моим серверным ПК.

Я создал простую эхо-программу.

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

После того, как я получаю с помощью буферизованного считывателя, я передаю данные в свою функцию в основном действии, которое интерны отправляет эти данные на сервер, записывая в OutputStream.Пока мой клиент отправляет эти данные, мой сервер зависает (занято-ожидание -> мое предположение), но через 5 секунд он возобновляет нормальную работу и успешно получает данные.Даже мой рабочий поток (AsyncTask) зависает, что очевидно, поскольку они представляют собой заметную задержку отображения сообщения в Logcat по сравнению с другими сообщениями.

Android Studio 3.3.1

Target API Level:> =26 (8.0 Oreo)

Тестовый сервер TCP - Hercules

@SuppressLint("StaticFieldLeak")
public void connect(){
    new AsyncTask<Void, Void, Boolean>(){

        @Override
        protected Boolean doInBackground(Void... voids) {
            try {
                socket  = new Socket(ip, portNo);
                out     = socket.getOutputStream();
                in      = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                socketAlive.set(true);
                return true;
            } catch (IOException e) {
                e.printStackTrace();
                return false;
            }
        }

        @Override
        protected void onPostExecute(Boolean result) {
            if(result){
                sendData("RegisterDevice:<ip>:<mac>");
                readerThread();
            }
            else{
                socketAlive.set(false);
                reconnect();
            }
        }
    }.execute();
}
@SuppressLint("StaticFieldLeak")
public void sendData(final String data){
    if(this.socket == null || this.socket.isClosed() )
    {
        //Unable to send data as output is closed returning
        return;
    }
    new AsyncTask<String, Void, Boolean>(){
        @Override
        protected Boolean doInBackground(String... writeString) {
            try {

out.write (writeString [0] .getBytes ());// - >> Casuing Server Socket для зависания

                //out.flush();
                return true;
            } catch (IOException e) {
                e.printStackTrace();
                return false;
            }
        }

        @Override
        protected void onPostExecute(Boolean result) {
            if(!result) {
                reconnect();
                sendData(data);
            }
        }
    }.execute(data);
}

@SuppressLint("StaticFieldLeak")
public void readerThread(){
    if(this.socket.isClosed())
    {
        //Unable to recieve data as output is closed returning
        return;
    }
    new AsyncTask<Void, Void, Boolean>(){
        @Override
        protected Boolean doInBackground(Void... voids) {
            try {
                Arrays.fill(readBuffer, '\0');
                //in.read(readBuffer, 0, Ethernet.TCP_READ_BUFFER_SIZE);//8192
                in.read(readBuffer);
                return  true;

            } catch (IOException e) {
                e.printStackTrace();
                return false;
            }
        }

        @Override
        protected void onPostExecute(Boolean result) {
            if(result) {
                //dataRead = String.copyValueOf(readBuffer, 0, Ethernet.TCP_READ_BUFFER_SIZE);
                String str = String.copyValueOf(readBuffer);
                str.trim();
                Log.i("Test", "Test");
                mainActivity.processEthernetData(String.copyValueOf(readBuffer, 0, Ethernet.TCP_READ_BUFFER_SIZE));
                Log.i("ReadInfo", String.copyValueOf(readBuffer, 0, Ethernet.TCP_READ_BUFFER_SIZE));
                readerThread();
            }
            else {
                reconnect();
            }
        }
    }.execute();
}

public void processEthernetData(final String protcol){

    eth.sendData(protcol);
}

1 Ответ

0 голосов
/ 14 февраля 2019

Проблема была вызвана

mainActivity.processEthernetData(String.copyValueOf(readBuffer, 0, Ethernet.TCP_READ_BUFFER_SIZE));

Видимо, строка, созданная и переданная функции, имела порядок TCP_READ_BUFFER_SIZE, что из значения 8192. Когда такая большая строка былапри передаче по TCP / IP мой сервер временно зависал, пока не получил полные данные.

Я исправил ошибку, изменив строку на

mainActivity.processEthernetData(String.copyValueOf(readBuffer, 0, ethernetBytesRead)); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...