`
答案在风中
  • 浏览: 65208 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

关于文件传输

阅读更多

最近项目经常使用到文件传输ftp、url访问等方式,查阅了些资料做了些整理和添加并不完善,希望能对大家有所帮助。
1.ftp文件传输源码:
1.1采用Runtime.getRuntime().exec()执行操作系统的ftp命令
1.1.1 ftp上传脚本
Windows脚本:
open 目标IP
用户名
密码(没有密码则不用写)
cd 目标路径
asc
prompt
put 本地文件(完整路径)
bye

Unix脚本:
ftp -n -i 目标IP <<!EOF
user 用户名 密码
cd 目标路径
lcd 本地文件路径
asc
prompt
put 本地文件
bye
!EOF
  
这里传送的是文本文件,所以采用asc模式传输。然后Java Runtime执行命令 [Runtime.getRuntime().exec(cmd)] 如下:

1.1.2cmd指令
Windows命令:
ftp -s:脚本文件(完整路径)

Unix命令:
sh 脚本文件(完整路径)

1.1.3代码示例:(注意命令不要有空格)

a.脚本示例:C:/Users/gkq/Desktop/ftp.txt
open 127.0.0.1
gkq
cd gkq
asc
prompt
put C:/Users/gkq/Desktop/test1.txt
bye
b.代码:

public class RuntimeTest {
public static void main(String[] args) throws IOException{
@SuppressWarnings("unused")
java.lang.Process process = java.lang.Runtime.getRuntime().exec("ftp -s:C:/Users/gkq/Desktop/ftp.txt ");
}
}

 
注:貌似采用这种方式中文路径问题是无法上传的
1.2实现本地文件传输到ftp服务器指定目录(中文路径支持),需要使用apache common.net jar包
代码示例:

public class FtpClient{
private String userName;
private String pwd;
private String url;
private int port;
private FTPClient ftpClient;
public FtpClient(String url, int port, String username, String password) throws Exception {
this.url = new String(url);
this.port = port;
this.userName = new String(username);
this.pwd = new String(password);
ftpClient=new FTPClient();
}
private void connect() throws SocketException, IOException{
ftpClient.connect(url, port);//连接FTP服务器
FTPClientConfig config = new FTPClientConfig(FTPClientConfig.SYST_UNIX);  
config.setServerLanguageCode("zh");  
config.setServerTimeZoneId("XXXX");
ftpClient.configure(config);
//设置默认超时
ftpClient.setDefaultTimeout(30000);
//设置数据超时
ftpClient.setDataTimeout(30000);
//socket超时
ftpClient.setSoTimeout(30000);
ftpClient.setBufferSize(524288);
//传输模式和类型
ftpClient.setFileTransferMode(FTP.BINARY_FILE_TYPE);  
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
ftpClient.setControlEncoding("GBK");
}
private void disconnect() throws IOException{
if (ftpClient.isConnected()) {
try {
ftpClient.disconnect();
} catch (IOException ioe) {
System.out.println("断开连接出错");
ioe.printStackTrace();
throw ioe;
}
}
}
private void login() throws Exception{
int reply;
try{
if(!ftpClient.login(userName, pwd)){
System.out.println("登入失败,用户名密码不匹配");
throw new Exception("登入失败,用户名密码不匹配");
}else{
//服务器是否响应
reply = ftpClient.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
ftpClient.disconnect();
throw new Exception("服务器无响应,登入失败");
}
}
}catch(Exception e){
e.printStackTrace();
throw e;
}
}
private void logout() throws Exception{
try{
if(!ftpClient.logout()){
System.out.println("退出失败");
throw new Exception("退出失败");
}
}catch(Exception e){
e.printStackTrace();
throw e;
}
}
public boolean uploadFile(String pathInPlatform, String filenameInPlatform, String fileInLocal) throws Exception{
try{
//连接ftp
this.connect();
//登入
this.login();
//转到指定目录,中文路径的处理
if(!ftpClient.changeWorkingDirectory(new String(pathInPlatform.getBytes("GBK"), "iso-8859-1"))){
System.out.println("访问目录不存在");
throw new Exception("访问目录不存在");
}else{
//上传文件
FileInputStream input=new FileInputStream(new File(fileInLocal));
ftpClient.storeFile(new String(filenameInPlatform.getBytes("GBK"), "iso-8859-1"),input);
input.close();
}
this.logout();
this.disconnect();
return true;
}catch(Exception e){
e.printStackTrace();
this.disconnect();
throw e;
}
}
}


2..web文件传输
通过url下载文件转为2进制流

public static synchronized byte[] getDataFromPlatform(URL url) throws Exception{
InputStream is=null;
HttpURLConnection httpConn;
int responseCode;
try{
    httpConn=(HttpURLConnection) url.openConnection();
responseCode=httpConn.getResponseCode();
if(responseCode==HttpURLConnection.HTTP_OK){
is=httpConn.getInputStream();
if (is != null) {  
ByteArrayOutputStream baos = new ByteArrayOutputStream();  
byte[] buf = new byte[1024];  
int ch = -1;  
int count = 0;  
while ((ch = is.read(buf)) != -1) {//读取1024字节数据,存储到buf中  ,是否读完
baos.write(buf, 0, ch);//从0开始ch长度的byte写入outstream
count += ch;//总数   
}
is.close();
baos.close();
return  baos.toByteArray();//--->存到数据库中
}
else{
    throw new Exception("Error,input Stream is null");
}
    }else{
    throw new Exception("Connect error,can not get any data");
    }
    }catch(Exception e){
    e.printStackTrace();
    throw e;
    }finally{
    httpConn.disconnect();
    }
}

 

3.Socket传输
待整理….

 

分享到:
评论
2 楼 答案在风中 2013-05-06  
jay61439476 写道
//设置默认超时
ftpClient.setDefaultTimeout(30000);
//设置数据超时
ftpClient.setDataTimeout(30000);
//socket超时
ftpClient.setSoTimeout(30000);


请教下这几种超时分别是什么含义?

这个写的有段时间了,java doc上解释是这样
setDefaultTimeout(int timeout):Set the default timeout in milliseconds to use when opening a socket.默认的socket连接超时时间。
setDataTimeout(int timeout):Sets the timeout in milliseconds to use when reading from the data connection.数据读取超时时间,openDataConnection这个值会覆盖socketTimeout的值。
setSoTimeout(int timeout):Set the timeout in milliseconds of a currently open connection.Only call this method after a connection has been opened设置当前连接超时时间。
我代码里给的值设定应该是有冗余的,这个情景下setDataTimeout应该就够用。
1 楼 jay61439476 2013-05-06  
//设置默认超时
ftpClient.setDefaultTimeout(30000);
//设置数据超时
ftpClient.setDataTimeout(30000);
//socket超时
ftpClient.setSoTimeout(30000);


请教下这几种超时分别是什么含义?

相关推荐

    C++编写的文件传输软件

    本篇文章将深入探讨一个基于C++编写的文件传输软件,尽管提供的源码中缺失了TcpServer.cpp和TcpClient.cpp两个关键组件,但仍然可以从剩余的代码中学习到关于文件传输和C++编程的一些基础知识。 首先,文件传输涉及...

    文件传输C语言实现

    下面是关于文件传输C语言实现的知识点: 1. 套接字编程:在文件传输中,套接字编程是实现文件传输的基础。套接字是一种endpoint,用于在网络上通信。在C语言中,使用套接字编程可以实现文件传输。 在给定的代码中...

    QT学习之文件传输和断点续传

    在这个"QT学习之文件传输和断点续传"的主题中,我们将深入探讨如何在QT环境中实现基于TCP的文件传输功能,并且特别关注断点续传技术。 首先,让我们了解TCP(Transmission Control Protocol)协议。TCP是一种面向...

    src_文件传输_源码

    标题中的“src_文件传输_源码”表明这是一个关于文件传输的源代码项目,可能包含实现文件在不同用户之间传输的编程代码。描述提到“多台用户共同连接服务端,可以在上传或者下载文件,通过socket相连”,这进一步...

    TCP/IP协议的文件传输 支持断点续传,大文件传输

    文件传输是TCP/IP协议应用的一个重要方面,尤其在处理大文件和断点续传功能时,其优势更为显著。本文将深入探讨TCP/IP协议在文件传输中的工作原理,以及如何实现断点续传和处理大文件。 首先,TCP(Transmission ...

    TCP文件传输系统(Version 1.6 多线程,断点续传,支持大文件传输)

    采用Visual C++ 6.0开发的一个TCP文件传输系统,采用多线程的传输方式,支持断点续传,利用配置文件设置基本的初始化信息。 文件包括源代码和安装包,源代码里包括自定义的文件传输通信协议。 程序采用分层的设计...

    C# socket TCP 大文件传输同时实现断点续传

    在C#编程语言中,利用Socket API进行TCP通信可以构建高效、稳定的文件传输系统,特别是在处理大文件时,断点续传功能则显得尤为必要。下面,我们将深入探讨如何使用C#的Socket实现TCP大文件传输并支持断点续传。 ...

    易语言文件传输客户端源码,易语言文件传输服务器源码,易语言大文

    在这个特定的压缩包中,我们拥有的是易语言编写的文件传输客户端和服务器的源码,这对于学习易语言以及网络文件传输技术是非常宝贵的资源。 首先,我们要理解“文件传输”在计算机科学中的基本概念。文件传输是网络...

    很好用的局域网文件传输工具——飞鸽传书

    飞鸽传书是一款在局域网环境中广泛应用的文件传输工具,尤其适合于那些不希望或者无法连接互联网的用户。这款软件以其高效、便捷和安全的特点,赢得了广大用户的喜爱。下面我们将详细探讨飞鸽传书的功能、工作原理...

    C# 大文件和多文件传输

    在IT行业中,大文件和多文件传输是一项常见的需求,特别是在网络应用、云存储以及文件共享等领域。本主题将深入探讨如何使用C#语言实现这样的功能,同时关注在传输过程中实现进度条显示、记录上传时间和大小等重要...

    delphi 多线程断点续传支持超大文件2G以上传输带源码

    断点续传功能则是在文件传输过程中,如果因为网络中断或其他原因导致传输中断,系统能够记录当前的传输进度,下次启动传输时可以从上次中断的地方继续,而不是从头开始。这对于大文件来说尤其重要,因为它节省了大量...

    python实现断文件点续传

    4. **断点续传协议**:客户端和服务器之间需要一种协议来交换关于文件传输状态的信息。例如,客户端可能需要发送一个包含当前传输位置的消息给服务器,然后服务器从该位置开始发送剩余的数据。 5. **错误处理和重试...

    使用c语言实现文件传输

    在IT领域,文件传输是一项基本的操作,特别是在网络编程中。本教程将深入探讨如何使用C语言来实现文件传输。C语言是一种底层、高效且灵活的编程语言,非常适合处理这种任务。 首先,我们要理解文件传输的基本原理。...

    VC文件传输-文件传输

    "VC文件传输-文件传输"这个主题涉及到的是使用Visual C++(简称VC)编程语言来设计和实现一个高效、多用户并发的文件传输系统。下面我们将深入探讨这一话题,主要关注服务端和客户端的设计、多线程处理、网络协议...

    MFC socket 文件传输

    标题"“MFC socket 文件传输”"指出,这个项目或教程主要关注如何使用MFC库来构建一个文件传输应用,该应用利用Socket技术进行文件的发送和接收。这通常涉及以下知识点: 1. **MFC基础**:理解MFC框架的基本结构,...

    文件传输源码 文件传输源码

    4. **断点续传**:如果文件传输过程中网络中断,断点续传功能允许从上次中断的位置继续传输,而不是重新开始。 5. **校验和/哈希值**:为了确保数据的完整性和准确性,会在传输前后计算文件的校验和或哈希值(如MD5...

    本地与虚拟机文件互传工具

    在IT领域,尤其是在进行开发、测试或系统管理时,本地计算机和虚拟机之间的文件传输是一项常见任务。"本地与虚拟机文件互传工具"是指能够帮助用户方便地在物理主机(本地计算机)与虚拟机之间交换文件的应用程序。...

    IPMSG飞鸽传书-可传5G以上文件

    《IPMSG飞鸽传书:突破5G大文件传输的利器》 在信息化时代,文件传输成为了日常工作和生活中的重要环节。尤其是对于大型企业和团队,高效、安全地传递大量数据至关重要。今天我们要介绍的是一款名为“IPMSG飞鸽传书...

    用netty实现文件传输

    - **异步处理**:Netty 的非阻塞 I/O 允许在等待文件传输的同时处理其他任务,提高了系统资源利用率。 5. **实例代码** - 服务器端创建 ServerBootstrap,配置 ChannelInitializer 来添加 ChannelHandler,启动...

    C# Winform 基于局域网文件传输Demo

    在本文中,我们将深入探讨如何使用C# Winform来实现基于局域网的文件传输功能。这个Demo项目主要依赖于TCP(Transmission Control Protocol)协议,它是一种面向连接、可靠的网络通信协议,常用于数据的可靠传输。让...

Global site tag (gtag.js) - Google Analytics