如何用代码在linux服务器上远程读取window电脑文件?

一、背景

老的系统某个功能采用C/S架构,就是在个人PC上安装单机window程序,收集连接该PC连接的物联网设备采集的信息存入本地文件(如Access数据库、Excel等)。而你的任务是:在应用服务器上收集局域网内PC电脑接收到的物联网采集的数据,进行加工处理。

二、方案与优缺点

2.1 方案选取

由于服务器要读老系统上的文件,方案有多种:

  • 方案1. 在PC上部署服务将文件信息读出来,暴露该服务端口;
  • 方案2. 配置PC文件共享,服务器上直接读取该共享文件;

2.2 方案优缺点分析

  • 方案1优缺点
    • 优点:服务部署在PC上,可利用PC的算例进行数据预处理,精简传输数据。
    • 缺点:服务部署在pc上,需要保证服务在PC上能稳定的提供服务(如添加自启动脚本);
  • 方案2优缺点
    • 优点:无需部署边缘服务、只需在服务器上部署集中程序,稳定性高,省人力;
    • 缺点:远程读取文件速度较慢

本项目中方案1、方案2都有采用,本文仅阐述方案2。如有同学想了解方案1的具体流程和代码(自启动设置与脚本等)可私信本人,本方案在在xp、win7、win11都已经成功验证,请放心阅读。

三、Window共享文件设置

若需要共享文件,需要确保服务器与电脑在同一个局域网内,可设置共享文件的访问密码也可不设置,若设置了密码,本文后面的linux服务器上读取时需要带上用户名与密码。本部分将介绍如何开启window文件共享(一共3步)

  • 第一步:打开文件共享,如下图所示:(单击需要共享的文件右键->属性->共享->高级共享->开启共享->设置共享名(如本文取名sharefile)-> 权限->添加->填写需要共享的对象(本文填所有人 everyone)-> 确定)

  • 第二步:访问用户组的访问权限设置(根据自己需要添加读写权限)

  • 第三步:网络共享配置(如下图所示,用ls命令可以查看到文件内容说明已经配置成功)

四、linux服务器读取共享文件

  • 确认linux服务器与PC的局域网ip是否畅通

  • 执行 smbclient命令查看共享文件夹(若服务器没安装smbclient命令,可先安装Samba)

  • 附:

    • 安装Samba(很多服务器已经默认安装)
    ini 复制代码
    # 禁止SELinux
    # 1.查看SELinux是否已经关闭
    getenforce
    
    # 2.修改配置文件关闭SELINUX
    vi /etc/selinux/config
    SELINUX=disabled
    
    
    # 安装samba
    
    yum -y install samba             
    yum -y install samba-client
    
    # 添加用户到samba并查看
    smbpasswd -a root
    pdbedit -L
    
    # 启动samba服务
    systemctl start smb
    • 遇到问题1:执行ls查看文件遇到错误 NT_STATUS_ACCESS_DENIED listing *,如下图所示。可能原因window电脑上的everyone用户组没加 或 SELinux未禁止

五、服务器端代码读取window电脑文件(Java为例)

  • 添加依赖
xml 复制代码
<dependency>
    <groupId>jcifs</groupId>
    <artifactId>jcifs</artifactId>
    <version>1.3.17</version> 
</dependency>
  • 读取远程文件代码
ini 复制代码
public static void main(String[] args) {
    String windowsIp = "ip"; // Windows计算机名称或IP地址
    String shareName = "sharefile"; // 共享文件夹名称
    String username = "windows-username"; // Windows计算机上的用户名
    String password = "windows-password"; // Windows计算机上的密码
    String fileName = "test.txt"; // 源文件的路径,确保在Windows计算机上的共享文件夹中
    String destinationFilePath = "/destination/file/"; // 存入linux服务的目录

    try {
        // 创建Samba上下文和身份验证 (若window 网络共享配置中关闭了密码共享,则不需要此处代码)
        NtlmPasswordAuthenticatio auth = new NtlmPasswordAuthentication(username, password);
        CIFSContext context = new CIFSContext(auth);

        // 连接到Windows计算机的共享文件夹
        SmbFile sourceFile = new SmbFile(windowsIp + "/" + shareName + "/"+ fileName, context);

        // 创建输入流以读取源文件
        InputStream inputStream = new FileInputStream(sourceFile + fileName);

        // 创建输出流以写入目标文件
        OutputStream outputStream = new FileOutputStream(destinationFilePath);

        // 复制源文件到目标文件
        byte[] buffer = new byte[1024];
        int bytesRead;
        while ((bytesRead = inputStream.read(buffer)) != -1) {
            outputStream.write(buffer, 0, bytesRead);
        }

        // 关闭输入输出流和Samba上下文
        inputStream.close();
        outputStream.close();
        context.close();
    } catch (Exception e) {
        e.printStackTrace();
    }

六、总结

  1. 读取远程文件快慢依赖于网络IO速度,大文件读取可能比较慢。
  2. window电脑的ip需要设置固定ip,避免winodw电脑ip频繁变动。
  3. 整体过程配置流程比较多、有问题可以私聊本人沟通。

祝大家开发顺利!

相关推荐
wn53143 分钟前
【Go - 类型断言】
服务器·开发语言·后端·golang
希冀1231 小时前
【操作系统】1.2操作系统的发展与分类
后端
GoppViper2 小时前
golang学习笔记29——golang 中如何将 GitHub 最新提交的版本设置为 v1.0.0
笔记·git·后端·学习·golang·github·源代码管理
爱上语文3 小时前
Springboot的三层架构
java·开发语言·spring boot·后端·spring
serve the people3 小时前
springboot 单独新建一个文件实时写数据,当文件大于100M时按照日期时间做文件名进行归档
java·spring boot·后端
罗政8 小时前
[附源码]超简洁个人博客网站搭建+SpringBoot+Vue前后端分离
vue.js·spring boot·后端
拾光师10 小时前
spring获取当前request
java·后端·spring
Java小白笔记11 小时前
关于使用Mybatis-Plus 自动填充功能失效问题
spring boot·后端·mybatis
JOJO___13 小时前
Spring IoC 配置类 总结
java·后端·spring·java-ee
白总Server14 小时前
MySQL在大数据场景应用
大数据·开发语言·数据库·后端·mysql·golang·php