JCIFS - 连接中断

Posted

技术标签:

【中文标题】JCIFS - 连接中断【英文标题】:JCIFS - connection breaks 【发布时间】:2014-09-14 18:03:21 【问题描述】:

我需要连接到一个 UNC“目录”并在该目录中创建一个文件。我在 *** 上找到了这个条目:access to file using Java with Samba JCIFS。一件好事是它在我的系统上运行良好,但是当我将程序放到服务器上时,我得到以下异常:

Exception in thread "main" jcifs.smb.SmbException: Failed to connect: <serverName>
jcifs.util.transport.TransportException: Connection in error
jcifs.util.transport.TransportException
java.net.ConnectException: Connection timed out: connect
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.PlainSocketImpl.doConnect(Unknown Source)
    at java.net.PlainSocketImpl.connectToAddress(Unknown Source)
    at java.net.PlainSocketImpl.connect(Unknown Source)
    at java.net.SocksSocketImpl.connect(Unknown Source)
    at java.net.Socket.connect(Unknown Source)
    at jcifs.smb.SmbTransport.ssn139(SmbTransport.java:196)
    at jcifs.smb.SmbTransport.negotiate(SmbTransport.java:249)
    at jcifs.smb.SmbTransport.doConnect(SmbTransport.java:322)
    at jcifs.util.transport.Transport.run(Transport.java:241)
    at java.lang.Thread.run(Unknown Source)
    at jcifs.util.transport.Transport.run(Transport.java:258)
    at java.lang.Thread.run(Unknown Source)
    at jcifs.util.transport.Transport.connect(Transport.java:154)
    at jcifs.smb.SmbTransport.connect(SmbTransport.java:307)
    at jcifs.smb.SmbTree.treeConnect(SmbTree.java:156)
    at jcifs.smb.SmbFile.doConnect(SmbFile.java:911)
    at jcifs.smb.SmbFile.connect(SmbFile.java:954)
    at jcifs.smb.SmbFile.connect0(SmbFile.java:880)
    at jcifs.smb.SmbFile.open0(SmbFile.java:972)
    at jcifs.smb.SmbFile.open(SmbFile.java:1006)
    at jcifs.smb.SmbFileOutputStream.<init>(SmbFileOutputStream.java:142)
    at jcifs.smb.SmbFileOutputStream.<init>(SmbFileOutputStream.java:97)
    at jcifs.smb.SmbFileOutputStream.<init>(SmbFileOutputStream.java:67)
    at path.unc.TestUNC.main(TestUNC.java:79)
    at jcifs.smb.SmbTransport.connect(SmbTransport.java:309)
    at jcifs.smb.SmbTree.treeConnect(SmbTree.java:156)
    at jcifs.smb.SmbFile.doConnect(SmbFile.java:911)
    at jcifs.smb.SmbFile.connect(SmbFile.java:954)
    at jcifs.smb.SmbFile.connect0(SmbFile.java:880)
    at jcifs.smb.SmbFile.open0(SmbFile.java:972)
    at jcifs.smb.SmbFile.open(SmbFile.java:1006)
    at jcifs.smb.SmbFileOutputStream.<init>(SmbFileOutputStream.java:142)
    at jcifs.smb.SmbFileOutputStream.<init>(SmbFileOutputStream.java:97)
    at jcifs.smb.SmbFileOutputStream.<init>(SmbFileOutputStream.java:67)
    at path.unc.TestUNC.main(TestUNC.java:79)

我创建了以下代码:

    //... read user, pw and uncPath from console
    NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication("", user, pw);

    SmbFile dir = new SmbFile(uncPath, auth);

    if (dir.isDirectory()) 
        writer.println(uncPath + " is a directory");
    

    uncPath = uncPath + "/test.txt";

    writer.println("full path = '" + uncPath + "'");

    SmbFile smbFile = new SmbFile(uncPath, auth);

    writer.println(smbFile.getPermission());

    SmbFileOutputStream uncOut = new SmbFileOutputStream(smbFile);
    PrintWriter uncPrint = new PrintWriter(uncOut);
    uncPrint.println("text from " + TestUNC.class);
    uncPrint.flush();
    // close stream

这会在控制台上创建以下输出:

    smb://<serverName>/myDirectory is a directory
    full path = 'smb://<serverName>/myDirectory/test.txt'

    (java.security.AllPermission <all permissions> <all actions>)

所以它可以访问该目录并且拥有所有权限。

就像我说的,在我的本地机器(Win 7 机器)上运行良好。服务器似乎无法创建文件。但可以登录查看路径是否为目录,服务器为Win 2008机器。

两台机器上的一个可能有趣的点是命令net use I: \\&lt;serverName&gt;\myDirectory &lt;pw&gt; /user:&lt;domain\user&gt; 工作正常,并允许在其中创建文件。

我的想法是来自服务器的响应时间过长并且 jcifs 将其关闭,因此我更改了超时值:

    System.setProperty("jcifs.smb.client.responseTimeout", "120000"); // default: 30000 millisec.
    System.setProperty("jcifs.smb.client.soTimeout", "140000"); // default: 35000 millisec.

【问题讨论】:

我们没有解决问题。我们做了以下“解决方法”:在服务器上,我们请求通过网络使用获得永久挂载。 您是否检查了目标 Windows 共享是否为 DFS 共享。如果是,请尝试使用托管文件/目录的已解析/物理服务器名称... @ron190 我取消了您在冒号前添加的空格。冒号在英语中遵循与其他标点符号相同的间距规则;前面没有空格,后面有一个空格。 您是否检查过服务器是否支持 SMB1? 【参考方案1】:

最近我遇到了类似的问题,我在连接到 SMB 服务器时发现问题是由于以下原因 -

注意,值得检查是否也与 DNS/IP 有问题。

【讨论】:

顺便说一句,有几个用Java编写的支持SMB2及以上的SMB客户端 谢谢 - 我已通过在 windows 10 操作系统中启用以下设置解决了我的连接问题 - 打开控制面板(只需在搜索框中输入 Control 即可快速找到其快捷方式)。单击程序,然后单击打开或关闭 Windows 功能(在程序标题下)。清除 SMB 1.0/CIFS 文件共享支持复选框【参考方案2】:

尝试使用 IP 地址而不是服务器名称。我有同样的问题并使用 IP 地址解决了

full path = 'smb://<IPaddress>/myDirectory/test.txt'

【讨论】:

如果我再次遇到问题,我会尝试。我不再参与那个项​​目了(更长的时间)。

以上是关于JCIFS - 连接中断的主要内容,如果未能解决你的问题,请参考以下文章

为啥总是网络连接中断?

电脑玩游戏怎么老是网络连接中断?

连接中断后如何自动重新连接Oracle连接池?

通过中断的连接从 Internet 下载文件

死锁是不是会导致任何活动连接超时/中断?

在关闭连接 MySQL Python 连接器之前中断正在运行的查询