У меня есть приложение Android, построенное на Java, где я отправляю SSH-команды пакету Python по запросу на сервер всякий раз, когда действие требует этого. Чтобы объяснить контекст, я открываю соединение Ganymed с сервером, затем открываю сеанс и с этого сеанса запускаю интерактивную оболочку, чтобы я мог импортировать свой собственный класс Python и вызывать из него функцию, загружающую данные всякий раз, когда происходит обновление наприложение. Я не могу выдавать отдельные команды, так как каждый раз слишком долго приходится открывать экземпляр Python, импортировать, открывать сокет ZMQ на сервере и т. Д.
Вот код для открытия оболочки:
session = connection.openSession();
session.requestDumbPTY();
session.startShell();
os = session.getStdin();
os.write("python\n".getBytes());
os.write("from package.data_receiver import DataReceiver\n".getBytes());
os.write("DR=DataReceiver()\n".getBytes());
os.write("DR.open_socket()\n".getBytes()); //opens the zmq socket on server
os
- глобальная переменная OutputStream
в классе Java, которую мой другой метод может вызвать write()
для запуска команд в классе Python DR
.
Однаковыдает ошибки, когда я хочу закрыть соединение / сеанс / выходной поток.
os.write("DR.close_socket()\n".getBytes()); //closes the zmq socket on server
os.write("exit()\n".getBytes()); //exits python
os.write("exit\n".getBytes()); //exits the shell
os.close();
session.close();
connection.close();
Когда этот код запускается, я получаю W/TransportManager: Receive thread: error in receiveLoop: Socket closed
, а последняя строка: DR.close_socket()
не запускается. Я не совсем уверен, нужно ли мне даже закрывать какой-либо из них или все из них, так как я могу закрыть OutputStream, и последняя команда все равно будет выполняться на удаленном сервере. Любые советы будут оценены. Спасибо!
Редактировать: Да, только что проверил, и если я не позвоню connection.close()
, тогда предыдущие соединения все еще остаются активными для сервера, но если я вызываю даже это, я получаю эту ошибку ипоследняя команда не выполняется.