Кодирование терминала для ANdroid, который связывается с удаленным сервером

Я переформулирую вопрос с некоторой дополнительной информацией, потому что он был в состоянии ожидания. Я удалю другой вопрос.

Я пытаюсь создать приложение, которое представляет собой консоль (например, cmd), где я могу отправлять заказы (команды) и получать ответ от сервера.

Итак, что я должен увидеть на моем экране, это мой заказ, а затем ответ сервера.

Что я должен сделать для этого?

Я пытаюсь с Service, Но Сервис не может работать с Сетью.

AsyncTask закончится, когда я отправлю первую команду. Поэтому мне придется переподключаться каждый раз, когда я решу отправить заказ (неэффективно?)

IntentService привязан к жизни деятельности. И заканчивается так же, как Asynctask делает.

Как я могу создать поток, где он впервые подключается к серверу. Затем, каждый раз, когда я отправляю в поток сообщение, он связывается с сервером и получает мой TextEdit информацию с сервера?


Отредактировано для состояния [в ожидании]. Добавление дополнительной информации


Вот что у меня есть:

  • Activity с TextView (используется для подсказки терминала), EditText (позволяет пользователю ввести команду, которую он хочет отправить) и Button отправить это.
  • Тот Activity ограничен Service сюда:

    ServiceConnection mConnection = new ServiceConnection() {
    
        public void onServiceDisconnected(ComponentName name) {
            mBounded = false;
            mServer = null;
        }
    
        public void onServiceConnected(ComponentName name, IBinder service) {
            mBounded = true;
            StatusService.LocalBinder mLocalBinder = (StatusService.LocalBinder)service;
            mServer = mLocalBinder.getServerInstance();
    
    
            /* once it is bounded, update data */
            updateSensorsData();
    
    
        }
    };
    
    /* ---------------- LIFE CYCLE METHODS -------------------------*/
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_console);
    
        Intent mIntent = new Intent(this, StatusService.class);
        bindService(mIntent, mConnection, BIND_AUTO_CREATE);
    
        /* Scrollable TextView for Console Prompt*/
        TextView tvConsole = (TextView) findViewById(R.id.tvConsole);
        tvConsole.setMovementMethod(new ScrollingMovementMethod());
    }
    
  • Service должен взаимодействовать с сервером и получать информацию TextView Итак, я реализовал:

    public String sendMessage(String message) {
    
        /* HERE I SHOULD CONNECT TO THE SERVER, BUT I DONT KNOW HOW */
        String response;
    
        connect(server, port);
        sendReceiveCmdControl(message);
    
    
        return response;
    }
    
    protected String sendReceiveCmdControl(String msg) throws InterruptedException {
        String res;
    
    
        send(controlOut, msg+"\n");
        // wait for response
        try {
            waitFor(controlIn, msg);
        } catch (EOFException e) {
            Log.d("ERROR", "Remote connection closed.");
            return "error";
    
        } catch (IOException e) {
            Log.d("ERROR", "IO problem.");
            return "error";
        } // end try
        // read the rest
        try {
            res = controlIn.readLine();
        } catch (IOException e) {
            Log.d("ERROR", "IO problem.");
            return "error";
        } // end try
    
    
        return(res);
    } // end sendReceiveCmdControl()
    

Где controlOut является PrintWriter, контроль в DataInputStream оба инициализируются в методе connect следующее:

   /* Connection I/O */
   public static Socket controlSocket = null;
   public static PrintWriter controlOut = null;
   public static DataInputStream controlIn = null;
   public static Socket imageSocket = null;
   public static PrintWriter imageOut = null;
   public static DataInputStream imageIn = null;

   protected void connect(String server, int port, boolean controlEnabled, boolean imageEnabled) {

        if (imageEnabled) {
            try {
                imageSocket = new Socket(server, port);
                imageOut = new PrintWriter(imageSocket.getOutputStream(), true);
                imageIn = new DataInputStream(new BufferedInputStream(imageSocket.getInputStream()));
                Log.d("INFO", "Connected to image socket correctly");
            } catch (UnknownHostException e) {
                disconnect();
                Log.d("ERROR", "Exception: " + e.getMessage());
                return;
            } catch (IOException e) {
                disconnect();
                Log.d("ERROR", "Exception: " + e.getMessage());
                return;
            }

        }

        if (controlEnabled) {
            try {
                controlSocket = new Socket(server, port+1);
                controlOut = new PrintWriter(controlSocket.getOutputStream(), true);
                controlIn = new DataInputStream(new BufferedInputStream(controlSocket.getInputStream()));
                Log.d("INFO", "Connected to control socket correctly");
            } catch (UnknownHostException e) {
                disconnect();
                Log.d("ERROR", "Exception: " + e.getMessage());
                return;
            } catch (IOException e) {
                disconnect();
                Log.d("ERROR", "Exception: " + e.getMessage());
                return;
            } 

        }

    }

Итак, что я хочу сделать, это:

  1. Подключитесь к серверу методом connect 1-й раз я запускаю Сервис.
  2. Каждый раз, когда я хочу отправить заказ на удаленный сервер, я должен сделать mServer.sendMessage(command); в моей деятельности.
  3. Итак Service взаимодействует с пультом Server и когда он получает ответ, Service получает ответ на Activity для обновления пользовательского интерфейса.

Если есть другой правильный путь, чем Activity-Service-Thread/Whatever... дайте мне знать, пожалуйста, спасибо за любую помощь. И спасибо за ваше терпение.

0 ответов

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