Возвращение подключенного сокета возвращает ноль - PullRequest
0 голосов
/ 15 мая 2019

Я пытаюсь создать клиент-серверное приложение на Android.Я хочу иметь класс, который инициализирует сокет и возвращает его в основной класс.У меня нет проблем с созданием и подключением сокета (мой сервер правильно обрабатывает соединение), но когда я пытаюсь вернуть созданный сокет в основной класс, он становится пустым.Что мне не хватает?

Я пытался использовать AsyncTask.

Это код основного класса:

public class MainActivity extends AppCompatActivity {
    private Socket socket;
    private SocketHandler sH;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        sH = new SocketHandler();
        sH.start();
        socket = sH.getSocket();

        if(socket == null){
             System.out.println("null");
        }else{
            System.out.println("not null");
        }
    }
}

Это код класса, который инициализирует сокет:

public class SocketHandler extends Thread {
    private Socket socket;

    public Socket getSocket(){
        return socket;
    }

    @Override
    public void run(){
        try{
            socket = new Socket("192.168.0.4", 9999);
        }catch (IOException e){
            e.printStackTrace();
        }
    }
}

1 Ответ

3 голосов
/ 15 мая 2019

Потоки выполняются параллельно, что означает, что НЕ гарантируется, что ваше сокетное соединение завершится немедленно, но вы ошибочно полагаете, что вы наступаете на классическое состояние гонки, потому что в момент вызова getSocket() соединение все еще устанавливается (но этот процесс еще не завершен), поэтому переменная socket по-прежнему null, поскольку она была инициализирована при создании экземпляра вашего SocketHandler.

Вам необходимо синхронизировать код, выполнить обратный вызов или (для целей тестирования) подождать немного перед вызовом getSocket() или прочитать пару раз (т.е. в цикле + некоторая задержка / тайм-аут, если значение сокета не равно *). 1008 * (но учтите, что null также должно быть допустимым значением в случае сбоя подключения к сокету).

Кроме того, почему вы читаете сокет в главном потоке, если вы создаете в отдельном потоке? разве вы не должны делать всю работу с сокетами в этом потоке?

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