Как правильно использовать smbj для подключения и отображения файлов на общем ресурсе samba в Android java? - PullRequest
0 голосов
/ 23 октября 2019

Когда я соединяюсь с smbj, журнал ошибок показывает:

...
I/c.h.s.c.Connection: Successfully authenticated user on 192.168.1.222, session is 4399187361905
I/c.h.s.s.Session: Logging off session 4399187361905 from host 192.168.1.222
I/c.h.s.t.PacketReader: Thread[Packet Reader for 192.168.1.222,5,main] stopped.
I/c.h.s.c.Connection: Closed connection to 192.168.1.222
I/c.h.s.s.Session: Connecting to \\192.168.1.222\pop on session 4399187361905

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

Caused by: com.hierynomus.smbj.common.SMBRuntimeException: com.hierynomus.protocol.transport.TransportException: Cannot write SMB2_TREE_CONNECT with message id << 4 >> as transport is disconnected

Что кажется очевидным, посколькунет открытого соединения.

Вопрос, связанный с smbj, показал, что была проблема с тем, как этот человек использовал оператор try ... Я считаю, что это аналогичный случай.

ВнутриAsyncTask, у меня есть:

try (Connection connection = client.connect(serverName)) {
    AuthenticationContext ac = new AuthenticationContext(username, password.toCharArray(), domain);
    Session session = connection.authenticate(ac);
    this.session = session;
    return session;
} catch (IOException e) {
    e.printStackTrace();
}

Я уверен, что есть проблема с try-catch. Может кто-нибудь, пожалуйста, дать полный кусок кода, включая AsyncTask - как должен иметь модуль smbj github. Я надеюсь, что это решит большинство проблем для всех пользователей.

1 Ответ

1 голос
/ 31 октября 2019

Вы используете ресурсный блок try-with. Блок try-with-resource автоматически выполняет close() для переменной, которая была инициализирована в его заголовке (заголовок Connection connection = client.connect(serverName)). В вашем случае он вызывает connection.close(), когда достигает конца блока try, когда достигает оператора return.

Если вы хотите сделать соединение постоянным, переместите блок инициализации внутриблок try-catch:

try {
    Connection connection = client.connect(serverName);
    this.connection = connection; // save the connection reference to be able to close it later manually
    AuthenticationContext ac = new AuthenticationContext(username, password.toCharArray(), domain);
    Session session = connection.authenticate(ac);
    this.session = session;
    return session;
} catch (IOException e) {
    e.printStackTrace();
}

Конечно, вы не должны забывать вручную вызывать connection.close(), когда хотите закрыть соединение. Поэтому вам следует также сохранить ссылку на созданное соединение где-нибудь, а не только на сеанс.

...