项目地址:https://github.com/b84955189/FileTransfer

由于巨懒的我不太喜欢使用U盘操作文件,特此开发一个简易的文件传输程序。

目前仅限局域网内传输,后期会尝试写下跨网传输。

本软件主要功能模块如下:

(1) 文件收发模块

(2) 局域网同网段用户检测模块

(3) 用户配置模块

文件收发模块:任意文件类型传输,仅限单个文件传输,可打包传输。

局域网同网段用户检测模块:同网段用户广播,直接发送,无需目标IP,前提需要同一网段下,且没有限制广播发送。

用户配置模块:用户自主选择是否允许同网段用户发现,自主选择文件保存目录,配置文件通过软件根目录下Config.cnf保存。


1.由于发送的模块需要read接收模块的确认接受信息,所以需要一定的阻塞时间,设置为无限



注意:设置了无限超时后,也要注意连接时的超时,防止输入错误IP后,一直尝试连接。

即可以单独设置连接超时:socket.connect(address,timeout);

项目中示例(SendThread中):

 //0-为无限等待
socket.setSoTimeout(0);
//TCP连接--设置了连接超时
socket.connect(address,3000);

2. 局域网IP获取问题

Java已经提供好了网络接口类,非常方便。

详情见博文:https://blog.csdn.net/weixin_43670802/article/details/103166435

3. 线程重复开启关闭问题

项目中涉及暴露线程关闭于重启问题。

由于同一线程对象的重启很麻烦,所以我省去了关闭过程,只是让其一直continue;wait()似乎也可以,可以尝试下)

也就是说此线程一直没关过。

//JVM默认初始化为false
private boolean sign;
/*
线程无法重启!!!所以这辈子我也不把它给关了!!
*/
while(true){
if(sign) {
//重新获取广播地址
broadcastAddress = CommonUtils.getBroadcastAddress();
//重新打包
DatagramPacket packet = new DatagramPacket(data, 0, data.length, broadcastAddress, R.Configs.UDP_PORT);
System.out.println(packet.getAddress().getHostAddress());
socket.send(packet); //1s一次
Thread.sleep(1000);
}else{
//1s一次
Thread.sleep(1000);
continue;
} }
} catch(Exception e){
e.printStackTrace();
JOptionPane.showMessageDialog(null,R.Strings.NETWORK_CHANGE);
//重新获取广播地址
broadcastAddress=CommonUtils.getBroadcastAddress();
//--test
System.out.println(broadcastAddress.getHostAddress());
//--test
if(broadcastAddress!=null)
this.run();
else {
JOptionPane.showConfirmDialog(null,R.Strings.NOT_NETWORK);
System.exit(0);
}
}
}
/*
线程开关
*/
public void setSwitch(boolean sign){
this.sign=sign; }

补充:https://blog.csdn.net/taoszu/article/details/82728405

4. 重复上传文件重名问题

获取到发送模块的文件名之后,使用File类的exist()方法检测是否已经存在。然后再利用字符串处理函数改名。

//输出文件路径+文件名
thisFile=new File(fileDirectory,fileName);
int fileCount=0;
//判断文件名是否冲突
while(thisFile.exists()){
int position=fileName.lastIndexOf(".");
String preFileName=fileName.substring(0,position);
String latFileType=fileName.substring(position);//不用去除'.'了
fileName=preFileName+"("+(++fileCount)+")"+latFileType;
thisFile=new File(fileDirectory,fileName); }

另外,用户中止上传后(即接收模块会抛出异常),可以调用thisFile.delete();来删除无用文件。

项目异常处理代码块中:

 //删除失败文件
thisFile.delete();

5. Java设置背景图片问题(复用)

项目中将设置界面背景的函数写入了CommonUtils工具类,另外注意中间媒介(图床)JLabel的地址一直没有变。

JLabel为MainView成员变量。(虽然很鸡肋。。。)

  /*
设置JFrame背景
前提-需要内容面板透明
````框架-载体地址-图片
*/
public static void setBackground(JFrame jFrame,JLabel jLabel,Image image){ JLayeredPane jLayeredPane=jFrame.getLayeredPane();
jLayeredPane.remove(jLabel);
jLabel.setIcon(new ImageIcon(image));
jLabel.setBounds(0,0,jFrame.getWidth(),jFrame.getHeight());
jLayeredPane.add(jLabel,new Integer(Integer.MIN_VALUE)); //jLayeredPane.add(jFrame.getContentPane(),new Integer(Integer.MAX_VALUE));
//jFrame.remove(jFrame.getLayeredPane());
//jFrame.setLayeredPane(jLayeredPane); jFrame.validate();
jFrame.repaint(); }

7. 顶部图标问题

本项目为了美化,即将初始标题栏去掉后,将图标放置在了JMenuBar上,自己体会吧。

 menuBar.add(Box.createHorizontalStrut(400));//间隔

        menuBar.add(minimizeMenuItem);
menuBar.add(closeMenuItem);

8.配置文件临时存储与写入问题

本项目创建了一个配置信息类,程序全局配置信息全部从此类中(静态方法)获取。

package transfer.data;

public class Configs {
//暴露开关,默认为开
private static int udpSwitch=0;
//默认保存地址为当前目录
private static String fileDirectory="."; public static int getUdpSwitch() {
return udpSwitch;
} public static void setUdpSwitch(int udpSwitch) {
Configs.udpSwitch = udpSwitch;
} public static String getFileDiretory() {
return fileDirectory;
} public static void setFileDirectory(String fileDirectory) {
Configs.fileDirectory = fileDirectory;
}
public static String toFile(){
return udpSwitch+","+fileDirectory;
}
public static void fromFile(String config){
String[] data=config.split(",");
Configs.setUdpSwitch(Integer.parseInt(data[0]));
Configs.setFileDirectory(data[1]);
}
}

正常关闭时写入本机文件Config,cnf

 /*
---之所以不直接用字符流,是因为不想让人随意查看配置文件--抬高一点逼格,然并卵...haha...
*/
private void saveConfigs(){
DataOutputStream dataOutputStream=null;
try {
dataOutputStream = new DataOutputStream(new FileOutputStream(configFile));
dataOutputStream.writeUTF(Configs.toFile());
dataOutputStream.close(); }catch (Exception e){
e.printStackTrace(); try {
if (dataOutputStream!=null)
dataOutputStream.close();
} catch (IOException ex) {
ex.printStackTrace();
} }
}

打开时读取文件至Config类中的静态变量中:

  /*
初始化读取配置文件
*/
private void initConfig(){
DataInputStream dataInputStream=null;
try{
dataInputStream=new DataInputStream(new FileInputStream(configFile));
String config=dataInputStream.readUTF();
if(config==null||config.equals(""))
throw new Exception();
else{
Configs.fromFile(config);
}
}catch(Exception e){
e.printStackTrace();
JOptionPane.showMessageDialog(null,R.Strings.READ_CONFIG_ERROR,R.Strings.TIP_TITLE,JOptionPane.ERROR_MESSAGE); }
}

用Java开发局域网内文件传输软件遇到的一些问题的更多相关文章

  1. nc 局域网聊天+文件传输(netcat)

    nc 局域网聊天+文件传输 nc的全程是netcat,这个工具非常好用. 有时候我们需要在局域网内传送一些文本消息或者文件的时候,通常的做法是安装一些局域网通讯软件,然后来做.其实不必要这样,使用nc ...

  2. java UDP聊天与文件传输

    package rgy.com.UDP3; import java.awt.Font; import java.awt.GridLayout; import java.awt.event.Action ...

  3. Delphi 局域网点对点文件传输(IdTcpClient控件)

    unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...

  4. 001、JAVA开发环境安装与eclipse软件第一印象

    折腾了快1个星期,一直没有成功装好JAVA环境,eclipse一直打不开,java环境配置的问题真是不得不吐槽一下,太烂了.今天反反复复折腾好久,终于搞定了.用的金山毒霸,方法如下: 一.打开金山毒霸 ...

  5. 用Java开发一个本地服务管理软件

    一.最终界面先贴上最终效果图,图1为初始化界面,图二为点击启动/停止之后的中间过渡状态,图三为启动成功后弹出的提示框 把动态gif图片嵌入到jpg背景图中?用Adobe ImageReady即可办到 ...

  6. Centos7安装文件传输软件rz sz

    一直使用Xshell的xftp传输文件,谁知道忽然无法正常使用. 于是,决定用户rz进行传输 安装步骤也比较简单 1.首先安装第三方源(以下源比默认源包含更多安装包,建议添加该源使用) yum ins ...

  7. java开发中的一些工具软件

    1. XJad, 反编译工具,类似于.Net中的Refractor.可以反编译单个jar文件或一个文件夹下的class文件,效果还不错. 2. dirtyJOE, class文件直接修改工具.有时想修 ...

  8. Linux下聊天和文件传输软件

    全平台聊天软件 米聊 官网地址: http://www.miliao.com 潮信 官网地址: https://www.chaoxin.com

  9. Socket规划中的局域网内测试

    前面提到的Socket信息及文件传输软件,如何测试和使用它? 事实上仅仅要推断client及server的局域网连通就可以. 1.Server在cmd下输入 ipconfig/all获得IP地址或者本 ...

随机推荐

  1. HTML网页设计基础笔记 • 【第5章 常用的样式属性】

    全部章节   >>>> 本章目录 5.1 字体及文本属性 5.1.1 字体属性 5.1.2 文本属性 5.2 边距和填充 5.2.1 边距 5.2.2 填充 5.3 边框属性 ...

  2. 编写Java程序,跑道长 50m,模拟 3 名学生同时在跑道跑步的场景 3名同学相当于3个线程对象

    查看本章节 查看作业目录 需求说明: 跑道长 50m,模拟 3 名学生同时在跑道跑步的场景 3名同学相当于3个线程对象 实现思路: 创建 Java 项目,在项目中创建StudentRunning类,该 ...

  3. Windows Server 2016 服务器安装IIS

    1. 打开服务器管理器,点击[添加角色和功能选项]  2.进入[添加角色和功能向导]页面,点击"下一步"  3.安装类型选择[基于角色或基于功能的安装],点击"下一步&q ...

  4. JDK_win10环境下安装JDK8时点击下一步没反应的解决办法

    问题现象 打开JDK8,点击下一步就没后续了... 解决方法 百度了一下"win10安装jdk8点下一步无响应" . 按照博客中说的操作试了下...安装成功了... 只想说...什 ...

  5. 初识python: 反射

    反射:通过字符串映射或修改程序运行时的状态.属性.方法 反射有以下三个方法: hasattr(object, name)           判断一个对象(object)里是否有对应的字符串(name ...

  6. 初识python 之 爬虫:爬取某网站的壁纸图片

    用到的主要知识点:requests.get 获取网页HTMLetree.HTML 使用lxml解析器解析网页xpath 使用xpath获取网页标签信息.图片地址request.urlretrieve ...

  7. Flask_环境部署(十六)

    flask自带的服务器,无法满足性能要求,我们这里采用Gunicorn做wsgi容器,来部署flask程序并使用 Nginx 做前端代理实现分流.转发.负载均衡,以及分担服务器的压力. Gunicor ...

  8. 基于CentOS7.x gitlab环境搭建,卸载,汉化 --汉化篇

    gitlab环境搭建,卸载,汉化--汉化篇 注意gitlab的版本需和汉化版本一致 安装git yum install -y git 下载最新的汉化包 cd git clone https://git ...

  9. 记一次ARM服务器(鲲鹏920)的PXE批量装机遇到的坑

    由于近期项目需要,在对一批华为鲲鹏920的ARM服务器(型号为天宫TG225 B1)进行批量装机的过程中,遇到了各种各样千奇百怪的bug(换个高情商的说法就是遇到了各种各样和x86服务器不一样的地方) ...

  10. 硬核 - Java 随机数相关 API 的演进与思考(下)

    本系列将 Java 17 之前的随机数 API 以及 Java 17 之后的统一 API 都做了比较详细的说明,并且将随机数的特性以及实现思路也做了一些简单的分析,帮助大家明白为何会有这么多的随机数算 ...