抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

搭建一个NAS服务器

新手教程:https://post.smzdm.com/p/a3gw7q27/

这篇文章我只进行到第二大步,第三步配置DDNS,安装应用程序,我没有实现,连不上网络。

外网访问

在加了一些相关群之后,我了解到了需要如何才能外网访问NAS,也就是第三步。
https://img-blog.csdnimg.cn/2021012916514897.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM2MzU3MjQy,size_16,color_FFFFFF,t_70

如上图,公网IP需要给连接网络所在运营商(联通,电信,移动)去申请,这个申请其实还是比较麻烦的,那么就只能是改公网IP,目前我没有找到改公网IP的办法,所以上图中的方式也就不行了。

使用内网穿透连接NAS

花生壳我就不多介绍了,能玩NAS,肯定也知道花生壳。
https://img-blog.csdnimg.cn/20210129165804202.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM2MzU3MjQy,size_16,color_FFFFFF,t_70

花生壳是可以分配一个域名给用户使用的,外网端口一般也是随机生成的。

内网主机:也就是NAS服务器的内网IP,端口为21。

设置NAS文件传输器

https://img-blog.csdnimg.cn/20210129170125172.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM2MzU3MjQy,size_16,color_FFFFFF,t_70

https://img-blog.csdnimg.cn/20210129170254942.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM2MzU3MjQy,size_16,color_FFFFFF,t_70

因为花生壳映射的端口是变化的,通常在10000-30000之间。
https://img-blog.csdnimg.cn/20210129170437775.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM2MzU3MjQy,size_16,color_FFFFFF,t_70

通过FTP连接到NAS服务器,上传文件。

import org.apache.commons.net.ftp.FTPClient; import org.apache.log4j.Logger; import java.io.*; /** * 通过FTP上传文件 * * @Author lvhaibao * @Date 2018/2/11 21:43 */ public class FTPTools { //用于打印日志 private static final Logger log = Logger.getLogger(FTPTools.class); //设置私有不能实例化 private FTPTools() { } /** * 上传 * * @param hostname ip或域名地址 * @param port 端口 * @param username 用户名 * @param password 密码 * @param workingPath 服务器的工作目 * @param inputStream 要上传文件的输入流 * @param saveName 设置上传之后的文件名 * @return */ public static boolean upload(String hostname, int port, String username, String password, String workingPath, InputStream inputStream, String saveName) { boolean flag = false; FTPClient ftpClient = new FTPClient(); //1 测试连接 if (connect(ftpClient, hostname, port, username, password)) { try { //2 检查工作目录是否存在 if (ftpClient.changeWorkingDirectory(workingPath)) { // 3 检查是否上传成功 if (storeFile(ftpClient, saveName, inputStream)) { flag = true; disconnect(ftpClient); } } } catch (IOException e) { log.error("工作目录不存在"); e.printStackTrace(); disconnect(ftpClient); } } return flag; } /** * 断开连接 * * @param ftpClient * @throws Exception */ public static void disconnect(FTPClient ftpClient) { if (ftpClient.isConnected()) { try { ftpClient.disconnect(); log.error("已关闭连接"); } catch (IOException e) { log.error("没有关闭连接"); e.printStackTrace(); } } } /** * 测试是否能连接 * * @param ftpClient * @param hostname ip或域名地址 * @param port 端口 * @param username 用户名 * @param password 密码 * @return 返回真则能连接 */ public static boolean connect(FTPClient ftpClient, String hostname, int port, String username, String password) { boolean flag = false; try { //ftp初始化的一些参数 ftpClient.connect(hostname, port); ftpClient.enterLocalPassiveMode(); ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE); ftpClient.setControlEncoding("UTF-8"); if (ftpClient.login(username, password)) { log.info("连接ftp成功"); flag = true; } else { log.error("连接ftp失败,可能用户名或密码错误"); try { disconnect(ftpClient); } catch (Exception e) { e.printStackTrace(); } } } catch (IOException e) { log.error("连接失败,可能ip或端口错误"); e.printStackTrace(); } return flag; } /** * 上传文件 * * @param ftpClient * @param saveName 全路径。如/home/public/a.txt * @param fileInputStream 要上传的文件流 * @return */ public static boolean storeFile(FTPClient ftpClient, String saveName, InputStream fileInputStream) { boolean flag = false; try { if (ftpClient.storeFile(saveName, fileInputStream)) { flag = true; log.error("上传成功"); disconnect(ftpClient); } } catch (IOException e) { log.error("上传失败"); disconnect(ftpClient); e.printStackTrace(); } return flag; } public static void main(String[] args) throws FileNotFoundException { String hostname = "ip"; int port = 端口; String username = "nas账户"; String password = "nas密码"; String workingPath = "/NAS/images/"; String str = "C:\\Users\\43834\\Desktop\\1.png"; InputStream fileInputStream = new FileInputStream(new File(str)); String saveName = "1.png"; System.out.println(FTPTools.upload( hostname, port, username, password, workingPath, fileInputStream, saveName)); } }

如果只是内网下使用NAS,那么可以直接输入NAS IP+端口 ,这样速度很快。

外网就需要映射的url+端口了!

评论