Ошибка закрытия сокета при закрытии сеанса и соединения Ganymed после выдачи команды - PullRequest
0 голосов
/ 07 ноября 2019

У меня есть приложение 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(), тогда предыдущие соединения все еще остаются активными для сервера, но если я вызываю даже это, я получаю эту ошибку ипоследняя команда не выполняется.

1 Ответ

0 голосов
/ 07 ноября 2019

Я думаю, что нашел решение этой конкретной проблемы: по какой-то причине, если я удаляю строку для выхода из оболочки и оставляю только строку, которая закрывает соединение, последняя команда все еще выполняется, и соединение успешно закрываетсятакже. Ошибка, которую я получил раньше, по-прежнему возникает, когда у меня connection.close(), но, кажется, все работает как положено.

Я удалил:

os.write("exit\n".getBytes());

И я сохранил:

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