有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在Linux上使用Java CIFS客户端库发送文件

我试图将一个包含打印数据(来自Zebra打印机的数据)的文件从Linux机器发送到Windows机器上的共享打印机,但没有成功,我尝试了所有方法。我的最后一个想法是,首先尝试在Linux机器上通过命令行工作,然后用Java执行相同的解决方案,结果是:它通过命令行工作,但在Java中不工作

我在Linux上的命令行解决方案有:

smbclient \\\\host\\printer_share -U 'domain/user%pass' -c "put file_name"

使用smbclient的解决方案非常有效,因此我考虑在Java中使用jCIFS,但在打印机中不起作用。在同一主机的共享文件夹中工作,但在打印机中不工作,但是通过命令行和smbclient都可以工作。有人知道我哪里出了问题吗

我的java代码:

public static void sendFileToPrinter(String commandsToPrinter) {
    String user = "user";
    String pass = "pass";
    String domain = "domain";

    String path = "smb://host/printer_share/file_to_print";
    NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication(domain, user, pass);
    SmbFile smbFile = new SmbFile(path, auth);
    SmbFileOutputStream smbfos = new SmbFileOutputStream(smbFile);
    smbfos.write(commandsToPrinter.getBytes());
    System.out.println("Work");
}   

Java错误:

enter image description here


共 (1) 个答案

  1. # 1 楼答案

    不管操作系统如何,我都能在@HieryNomus的帮助下解决这个问题,他有一个实现SMB的完美库。Git链接:https://github.com/hierynomus/smbj/

    出于我的需要,我通过以下实现实现了(这只是我的测试代码):

    public static void sendCommandToZebraPrinter(String command) throws MalformedURLException, SmbException, IOException {
    
        String username = "username";
        String password = "password";
        String domain = "mydomain";
        String sharedDirectory = "PRINTER_SHARE";
        String computerName = "MYCOMPUTER";
    
        SMBClient client = new SMBClient();
    
        try (Connection connection = client.connect(computerName)) {
            AuthenticationContext ac = new AuthenticationContext(username, password.toCharArray(), domain);
            Session session = connection.authenticate(ac);
            try (PrinterShare share = (PrinterShare) session.connectShare(sharedDirectory)) {
                InputStream stream = new ByteArrayInputStream(command.concat("\n").getBytes(StandardCharsets.UTF_8));
                share.print(stream);
            }
        }
    }
    

    命令变量是Zebra打印机(GC420t)的EPL命令,例如:

    I8,A,001
    
    
    Q104,024
    q863
    rN
    S2
    D11
    ZT
    JF
    OD
    R172,0
    f100
    N
    75,33,D,h3,"1"
    b363,39,D,h2,"TEST"
    b198,33,D,h3,"TEST"
    LO154,4,1,73
    LO280,4,1,73
    A149,27,2,2,1,1,N,"1"
    A272,26,2,3,1,1,N,"TEST"
    A425,26,2,3,1,1,N,"TEST"
    P1
    

    如果命令不起作用:在命令末尾添加\n