如何正确使用 smbj 连接和列出 Android java 中 samba 共享上的文件?
How to properly use smbj to connect and list files on a samba share in Android java?
当我连接 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 应该有的。
我希望这会为所有用户解决大部分问题。
您正在使用试用资源块。 try-with-resource 块自动对已在其头部初始化的变量执行 close()
(头部为 Connection connection = client.connect(serverName)
)。在您的情况下,它在到达 return
语句时到达 try
块的末尾时调用 connection.close()
。
如果要使连接持久化,请将初始化块移动到 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()
。因此,您还应该在某处保存对已创建连接的引用,而不仅仅是会话。
当我连接 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 应该有的。 我希望这会为所有用户解决大部分问题。
您正在使用试用资源块。 try-with-resource 块自动对已在其头部初始化的变量执行 close()
(头部为 Connection connection = client.connect(serverName)
)。在您的情况下,它在到达 return
语句时到达 try
块的末尾时调用 connection.close()
。
如果要使连接持久化,请将初始化块移动到 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()
。因此,您还应该在某处保存对已创建连接的引用,而不仅仅是会话。