Разъем для эмулятора Android работает, но не для реального устройства - PullRequest
0 голосов
/ 31 января 2019

У меня есть Java-код, который отправляет строки через IP в скрипт Python.Код прекрасно работает с эмулятором, но когда я успешно устанавливаю приложение через USB на свой телефон, он не работает.Вот код:

import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

public class MainActivity extends AppCompatActivity {
    public String message;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final Button btn_python = findViewById(R.id.python);
        final Button btn_movie = findViewById(R.id.movie);
        final Button btn_hw = findViewById(R.id.homework);
        btn_python.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view1) {
                send py = new send();
                message = "python";
                Log.i("Button", "Button works");
                System.out.println("whatever");
                py.execute();
            }
        });
        btn_movie.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view2) {
                send mov = new send();
                message = "movie";
                mov.execute();
            }
        });
        btn_hw.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view2) {
                send hw = new send();
                message = "homework";
                hw.execute();
            }
        });
    }
    class send extends AsyncTask<Void,Void,Void>{
        Socket s;
        PrintWriter pw;
        @Override
        protected Void doInBackground(Void...params) {
            System.out.println("whatevernumbertwo");
            try {
                System.out.println("whatevernumberthree");
                s = new Socket("ip address", 7800);
                Log.i("Socket", "connects to socket");
                pw = new PrintWriter(s.getOutputStream());
                Log.i("output stream", "Output stream works");
                pw.write(message);
                Log.i("write", "Write works");
                pw.flush();
                Log.i("flush", "Flush works");
                pw.close();
                s.close();
            } catch (UnknownHostException e) {
                System.out.println("Fail");
                e.printStackTrace();
            } catch (IOException e) {
                System.out.println("Fail");
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }  
            return null;
        }
    }
}

Как я уже говорил, это работает на эмуляторе, но не на реальном устройстве.Соответствующие разрешения также были даны.Что я делаю неправильно?Заранее спасибо.

1 Ответ

0 голосов
/ 31 января 2019

После долгих раскопок он все время оказался межсетевым экраном сервера.Это объясняет, почему (по-видимому) не было выдано исключение, и почему код, похоже, не выполнялся;он выполнялся , он просто застревал внутри Socket() (во время соединения).

Конечно Socket() фактически выбрасывает IOException;вероятно, это займет некоторое время.

Код работает на эмуляторе, поскольку, поскольку он работает на той же машине, он находится за брандмауэром.

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