Кодирование терминала для 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;
}
}
}
Итак, что я хочу сделать, это:
- Подключитесь к серверу методом
connect
1-й раз я запускаю Сервис. - Каждый раз, когда я хочу отправить заказ на удаленный сервер, я должен сделать
mServer.sendMessage(command);
в моей деятельности. - Итак
Service
взаимодействует с пультомServer
и когда он получает ответ,Service
получает ответ наActivity
для обновления пользовательского интерфейса.
Если есть другой правильный путь, чем Activity-Service-Thread/Whatever...
дайте мне знать, пожалуйста, спасибо за любую помощь. И спасибо за ваше терпение.