PrintWriter в Слушателе вылетает приложение - PullRequest
0 голосов
/ 16 мая 2018

Я хочу создать очень простой клиент-сервер TCP / IP с устройством Android, являющимся клиентом, и Arduino, являющимся сервером.

Так вот мой код:

public class MainActivity extends AppCompatActivity {

    private Socket socket;

    private static final int SERVERPORT = 80;
    private static final String SERVER_IP = "192.168.1.141";

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

        new Thread(new ClientThread()).start();
    }

    public void onClick(View view){
        try {
            TextInputLayout input1 = (TextInputLayout) findViewById(R.id.input1);
            String str = input1.getEditText().getText().toString();

            PrintWriter out = new PrintWriter(this.socket.getOutputStream(), true);
            out.println(this.socket.getInetAddress().toString());
            out.flush();

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

    class ClientThread implements Runnable{
        @Override
        public void run(){
            try{
                InetAddress serverAddr = InetAddress.getByName(SERVER_IP);
                socket = new Socket(serverAddr, SERVERPORT);
            }
            catch(UnknownHostException e1){
                e1.printStackTrace();
            }
            catch(IOException e2){
                e2.printStackTrace();
            }
        }
    }
}    

Телефон может подключиться к серверу, когда я загружаю приложение (я вижу его на серийном мониторе Arduino), но когда я нажимаю на кнопку, происходит сбой из-за предположительно класса PrintWriter.

Странно то, что если я печатаю сообщение из метода run () в классе ClientThread, то сообщение отправляется нормально.

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

Проблема связана с комбинацией слушателя onClick и PrintWriter, но я просто не понимаю, почему именно.

Ответы [ 2 ]

0 голосов
/ 17 мая 2018

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

0 голосов
/ 16 мая 2018

Что ж, сбой, скорее всего, происходит из-за того, что вы пытаетесь получить доступ к переменной socket, когда она пуста, если невозможно установить соединение с вашим сервером. Точную причину, по которой это происходит, можно найти в журналах (проблема сети, проблема безопасности и т. Д. Все возможно).

...