Сокеты Android не работают только в рабочем режиме

Я пытаюсь отправить сообщение через сокеты Android, но всякий раз, когда я пытаюсь открыть сокет в режиме выполнения, я просто получаю SocketException. Вот strackTrace:

04-03 11:08:55.761 5597-6574/com.example.username.shutterdoor W/System.err: java.net.SocketException: Software caused connection abort
04-03 11:08:55.768 5597-6574/com.example.username.shutterdoor W/System.err:     at java.net.PlainSocketImpl.socketConnect(Native Method)
        at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:334)
        at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:196)
        at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:178)
04-03 11:08:55.768 5597-6574/com.example.username.shutterdoor W/System.err:     at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:356)
        at java.net.Socket.connect(Socket.java:586)
        at java.net.Socket.connect(Socket.java:535)
        at java.net.Socket.<init>(Socket.java:427)
        at java.net.Socket.<init>(Socket.java:210)
04-03 11:08:55.769 5597-6574/com.example.username.shutterdoor W/System.err:     at com.example.username.shutterdoor.UnconfiguredDeviceCheckTask.doInBackground(UnconfiguredDeviceCheckTask.java:34)
04-03 11:08:55.769 5597-6574/com.example.username.shutterdoor W/System.err:     at com.example.username.shutterdoor.UnconfiguredDeviceCheckTask.doInBackground(UnconfiguredDeviceCheckTask.java:11)
        at android.os.AsyncTask$2.call(AsyncTask.java:304)
        at java.util.concurrent.FutureTask.run(FutureTask.java:237)
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:243)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
        at java.lang.Thread.run(Thread.java:762)

А вот мой код:

public class UnconfiguredDeviceCheckTask extends AsyncTask<String,Void,Integer>{

    final static String DEFAULT_DEVICE_IP = "192.168.4.1";
    final static int DEFAULT_DEVICE_PORT = 7510;
    final static String REQUEST_DEVICE_CHECK = "C8\r";

    private AsyncResult resultCallback;
    private int resultCode = 0;

    public UnconfiguredDeviceCheckTask(AsyncResult result){
        resultCallback = result;
    }

    @Override
    protected Integer doInBackground(String... strings) {
        try{
            Log.i("Wifi","Sleeping");
            Thread.sleep(5000);
        }catch(InterruptedException e){
            Log.i("Wifi","Async connection task is interrupted while sleeping");
        }
        try {
            Log.i("Wifi","Attempting to open socket");
            Socket socket = new Socket(DEFAULT_DEVICE_IP, DEFAULT_DEVICE_PORT);
            try {
                BufferedInputStream in = new BufferedInputStream(socket.getInputStream());
                try{
                    PrintStream out = new PrintStream(socket.getOutputStream());
                    out.write(REQUEST_DEVICE_CHECK.getBytes());

                    socket.setSoTimeout(10000);
                    while(resultCode == 0) {
                        resultCode = in.read();
                        Log.i("Wifi","Setting result code to " + resultCode);
                    }
                }catch (IOException e){
                    Log.e("Wifi","Could not create PrintStream");
                }
            }catch (IOException e){
                Log.e("Wifi","Could not create inputStream");
            }


            Log.i("Wifi","No response, Connection timed out");

        }catch (IOException e){
            Log.e("Wifi","Unable to create socket to 192.168.4.1");
            e.printStackTrace();
        }
        return resultCode;
    }

Однако сокет открывается нормально в режиме отладки, когда точка останова установлена ​​там, где создается сокет. Я не понимаю, как это исправить. Любая помощь?

Извините, но мне удалось решить эту проблему, установив для thread.sleep значение 10 секунд вместо 5. Это заняло у меня целый день.

brandon fox 03.04.2018 06:19

Вы можете проверить мой пост по этому поводу, stackoverflow.com/a/49124580/6549856

Chintak Patel 03.04.2018 07:16
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
2
33
0

Другие вопросы по теме