Java远程传输文件(增加覆盖取消等功能)

合集下载

java sftp 常用方法

java sftp 常用方法

一、介绍随着信息化时代的到来,数据传输变得越来越重要。

在企业中,有时候需要通过网络将数据从一个服务器传输到另一个服务器。

而其中一种常用的数据传输协议就是SFTP(Secure File Transfer Protocol)。

SFTP是一种基于SSH协议的安全文件传输协议。

它提供了一种安全的通信渠道以及文件传输功能,能够有效地保护传输的数据安全。

在Java中,我们可以通过一些常用的方法来实现SFTP的文件传输,本文将介绍一些Java中SFTP常用的方法。

二、建立SFTP连接在Java中,我们可以使用JSch库来建立SFTP连接。

需要在项目中导入JSch库的jar包。

我们可以通过以下方法来建立SFTP连接:1. 创建JSch对象我们可以通过new JSch()来创建一个JSch对象,用于后续的SFTP连接。

2. 建立Session使用JSch对象的getSession方法建立一个Session对象,需要传入用户名、主机位置区域和端口号等参数,并通过setPassword或setPrivateKey方法设置认证方式。

3. 打开Channel在建立Session之后,可以通过Session对象的openChannel方法打开一个Channel,类型为" sftp"。

4. 建立SFTP连接使用ChannelSftp的connect方法来建立SFTP连接。

以上即为建立SFTP连接的步骤,通过这些方法,我们可以在Java中轻松地实现SFTP连接的功能。

三、上传文件一旦建立了SFTP连接,我们就可以进行文件的上传操作了。

通过以下方法可以实现文件的上传:1. 使用put方法在ChannelSftp对象中,可以使用put方法来上传文件。

需要传入本地文件路径和远程文件路径两个参数。

2. 设置传输模式在上传文件之前,可以通过ChannelSftp对象的setmode方法来设置传输模式,常用的传输模式包括OVERWRITE、RESUME等。

java 微服务之间传输文件,导致文件失真的排查处理方案

java 微服务之间传输文件,导致文件失真的排查处理方案

java 微服务之间传输文件,导致文件失真的排查处理方案在Java 微服务架构中,文件传输可能受到一些问题的影响,例如文件失真、损坏或数据丢失。

以下是一些排查和处理文件传输问题的常见方案:1. 网络稳定性检查:确保微服务之间的网络连接是稳定的。

网络不稳定可能导致文件传输中的数据包丢失或损坏。

可以使用网络诊断工具来检查网络连接的稳定性。

2. 文件传输协议和工具:确保你使用的文件传输协议和工具是稳定和可靠的。

例如,可以考虑使用HTTP 或FTP 协议,或者使用成熟的文件传输工具如Apache Camel 等。

3. 传输文件的编码和解码:确保在发送和接收端使用相同的文件编码和解码方式。

不同的编码方式可能导致文件解析时的失真。

4. 文件大小限制:检查微服务框架、中间件或文件传输工具是否有关于文件大小的限制。

大文件可能需要特殊处理,例如分片传输或使用分布式文件系统。

5. 数据校验和:在文件传输前后计算文件的校验和,例如MD5、SHA-256 等。

接收端可以验证文件的完整性,确保传输过程中没有数据损坏。

6. 日志和错误处理:在文件传输的过程中,详细记录日志以便追踪问题。

在微服务中实现良好的错误处理机制,可以更快地发现和解决问题。

7. 使用消息队列:考虑使用消息队列系统来处理文件传输。

消息队列可以提供异步传输,降低服务之间直接通信的复杂性,并提高系统的稳定性。

8. 增加重试机制:在文件传输失败时,实现重试机制,以应对临时性的网络故障。

重试机制应该有一定的延迟和次数限制,避免无限制地重试。

9. 使用分布式文件系统:考虑将文件存储在分布式文件系统中,例如Hadoop Distributed File System (HDFS) 或Amazon S3。

这样可以提高文件的可靠性和可用性。

通过组合以上一些方案,你可以更好地排查和处理在Java 微服务之间文件传输过程中可能出现的问题,确保文件传输的可靠性和完整性。

java传输文件 方案

java传输文件 方案

Java传输文件方案1. 简介在开发Java应用程序时,经常需要通过网络传输文件。

本文将介绍几种常见的Java传输文件的方案,包括使用原生Java API实现文件传输、使用FTP协议传输文件以及使用HTTP协议传输文件。

2. 使用原生Java API实现文件传输Java提供了一系列的API来处理文件传输操作。

下面将介绍如何使用原生Java API实现文件传输。

2.1 文件上传在Java中,可以使用java.io包提供的类来实现文件上传。

以下是一个简单的文件上传示例:import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.OutputStream;import .Socket;public class FileUploader {public static void uploadFile(File file, String host, int port) thr ows IOException {try (Socket socket = new Socket(host, port);FileInputStream fileInputStream = new FileInputStream(fil e);OutputStream outputStream = socket.getOutputStream()) { byte[] buffer = new byte[4096];int bytesRead;while ((bytesRead = fileInputStream.read(buffer)) != -1) {outputStream.write(buffer, 0, bytesRead);}}}}在上述示例中,我们使用Socket类实现了与服务器建立连接,并使用FileInputStream读取文件内容,并通过OutputStream将文件内容写入到服务器。

JAVA文件上传、删除、下载的通用方法总结

JAVA文件上传、删除、下载的通用方法总结
this.uploadFileName = uploadFileName; } public static long getSerialversionuid() {
return serialVersionUID; } public String getUploadContentType() {
return uploadContentType; } public void setUploadContentType(String uploadContentType) {
</script>
这段代码是可行的,但不知道是不是精炼的
写好 jsp 的代码,现在写后台的 action 代码:
为了方便代码整体粘贴方便快捷,我先把整体代码写出来,后面在做解释。一些简单的就直
接在注释中解释了 public class upload{
private static final long serialVersionUID = 1L; private File upload;//实际上传文件 private String uploadFileName; //上传文件名 private String uploadContentType; //上传文件类型 //首先set get 封装这四个属性
delfile.getName()); delfile.delete();
//System.out.println("删除文件成功"); }else if (delfile.isDirectory()) {
deletefile(delpath + "\\" + filelist[i]); } } file.delete(); }
</td>

java实现两台电脑间TCP协议文件传输

java实现两台电脑间TCP协议文件传输

java实现两台电脑间TCP协议⽂件传输记录下之前所做的客户端向服务端发送⽂件的⼩项⽬,总结下学习到的⼀些⽅法与思路。

注:本⽂参考⾃《⿊马程序员》视频。

⾸先明确需求,在同⼀局域⽹下的机器⼈A想给喜欢了很久的机器⼈B发送情书,但是机器⼈B事先并不知道⼩A的⼼思,那么作为⽉⽼(红娘)该如何帮助他们呢?然后建⽴模型并拆分需求。

这⾥两台主机使⽤⽹线直连,在物理层上确保建⽴了连接,接下来便是利⽤相应的协议将信息从电脑A传给电脑B。

在这⼀步上,可以将此过程抽象为⽹络+I/O(Input、Output)的过程。

如果能在⼀台电脑上实现⽂件之间的传输,再加上相互的⽹络协议,羞涩的A不就可以将情书发送给B了吗?因此要先解决在⼀台电脑上传输信息的问题。

为了在⽹络上传输,使⽤必要的协议是必要的,TCP/IP协议簇就是为了解决计算机间通信⽽⽣,⽽这⾥主要⽤到UDP和TCP两种协议。

当⼩A可以向⼩B发送情书后,⼜出现了众多的追求者,那么⼩B如何去处理这么多的并发任务呢?这时便要⽤到多线程的技术。

因此接下来将分别介绍此过程中所⽤到了I/O流(最基础)、⽹络编程(最重要)、多线程知识(较重要)和其中⼀些⼩技巧。

⼀、I/O流I/O流⽤来处理设备之间的数据传输,Java对数据的传输通过流的⽅式。

流按操作数据分为两种:字节流与字符流。

如果数据是⽂本类型,那么需要使⽤字符流;如果是其他类型,那么使⽤字节流。

简单来说,字符流=字节流+编码表。

流按流向分为:输⼊流(将硬盘中的数据读⼊内存),输出流(将内存中的数据写⼊硬盘)。

简单来说,想要将某⽂件传到⽬的地,需要将此⽂件关联输⼊流,然后将输⼊流中的信息写⼊到输出流中。

将⽬的关联输出流,就可以将信息传输到⽬的地了。

Java提供了⼤量的流对象可供使⽤,其中有两⼤基类,字节流的两个顶层⽗InputStream与OutputStream;字符流的两个顶层⽗类Reader 与Writer。

这些体系的⼦类都以⽗类名作为后缀,⽽⼦类名的前缀就是该对象的功能。

基于JAVA的FTP文件传输系统设计与开发(课程设计)

基于JAVA的FTP文件传输系统设计与开发(课程设计)

类型:课程设计基于JA V A的FTP文件传输系统设计与开发引言FTP(File Transfer Protocol)是文件传输协议的简称。

FTP 的主要作用,就是让用户连接上一个远程计算机(这些计算机上运行着FTP服务器程序)查看远程计算机有哪些文件,然后把文件从远程计算机上拷到本地计算机,或把本地计算机的文件送到远程计算机去。

目前FTP服务器软件都为国外作品,例如Server_U、IIS,国内成熟的FTP服务器软件很少,有一些如(Crob FTP Se rver),但从功能上看来远不能和那些流行的服务器软件媲美。

下面对这些软件简单的做一个比较:IIS只适用于NT/2000/XPWindows操作系统,适合建个小型的同时在线用户数不超过10个的FTP服务器。

它对账户的管理按照Windows用户账户方式进行;比起IIS来,Server_U的管理功能强大得多,而且设置也很方便。

它是一款由Rob Beckers开发的获奖的FTP服务器软件,它功能强大又易于使用,支持9x/ME/NT/2K 等全Windows系列。

FTP服务器用户通过它用FTP协议能在internet上共享文件。

Serv-U不仅100%遵从通用FTP标准,也包括众多的独特功能可为每个用户提供文件共享完美解决方案。

它并不是简单地提供文件的下载,还为用户的系统安全提供了相当全面的保护。

例如:您可以为您的 FTP 设置密码、设置各种用户级的访问许可等等;而Crob FTP Server从功能设置上可以看出,它沿用了像Server_U等主流FTP服务器软件的基本设置;并加入了不少人性化的功能;同时支持多服务器。

(即在软件中可以在任意的有效端口上建立任意多的FTP服务器并可同时运行,各服务器间互不相干的稳定运行)应该说进步是非常大的。

并且可以应用于Windows 95/98/ME/me/N/T2000及最新的.NET操作系统上。

不过,纵观上面这些软件,它们都只能在Windows操作系统中运行,并且功能过于强大,许多功能应用于我们的考试系统的话,并没有太大的意义,而且有些也没必要,于是就需要一个专用的,而且也能通用(应用于UNIX等其他的操作系统)的FTP服务器。

java sshclient 用法

java sshclient 用法

一、什么是Java SSHClientJava SSHClient是一种用于在Java应用程序中进行远程Shell操作的工具。

它允许用户通过SSH协议连接到远程服务器,并执行命令、上传或下载文件等操作。

二、Java SSHClient的优势1. 支持多种加密算法:Java SSHClient支持多种加密算法,包括AES、3DES等,保障了通讯的安全性。

2. 灵活的配置选项:Java SSHClient提供了丰富的配置选项,可以根据需求进行定制化配置,满足不同场景的需求。

3. 易用性:Java SSHClient提供了简单易用的API,使得用户可以轻松地在Java应用程序中集成SSH功能。

三、Java SSHClient的基本用法1. 连接到远程服务器要使用Java SSHClient连接到远程服务器,首先需要创建一个SSHClient对象,并设置连接参数,如用户名、密码、服务器位置区域、端口等。

```javaSSHClient client = new SSHClient();client.connect("hostname");client.authPassword("username", "password");```2. 执行远程命令连接到远程服务器后,可以通过Session对象执行远程命令,并获取命令的执行结果。

```javaSession session = client.startSession();Command cmd = session.exec("ls -l");cmd.join();System.out.println(cmd.getOutputAsString());session.close();```3. 上传或下载文件Java SSHClient还提供了上传或下载文件的功能,可以方便地在远程服务器和本地文件系统之间进行文件传输。

用java实现ftp服务

用java实现ftp服务

用Java来实现FTP服务器应用的详细讲解【文章摘要】根据FTP 的工作原理,在主函数中建立一个服务器套接字端口,等待客户端请求,一旦客户端请求被接受,服务器程序就建立一个服务器分线程,处理客户端的命令。

如果客户端需要和服务器端进行文件的传输,则建立一个新的套接字连接来完成文件的操作。

FTP 命令FTP 的主要操作都是基于各种命令基础之上的。

常用的命令有:◆设置传输模式,它包括ASCⅡ(文本) 和BINARY 二进制模式;◆目录操作,改变或显示远程计算机的当前目录(cd、dir/ls 命令);◆连接操作,open命令用于建立同远程计算机的连接;close命令用于关闭连接;◆发送操作,put命令用于传送文件到远程计算机;mput 命令用于传送多个文件到远程计算机;◆获取操作,get命令用于接收一个文件;mget命令用于接收多个文件。

编程思路根据FTP 的工作原理,在主函数中建立一个服务器套接字端口,等待客户端请求,一旦客户端请求被接受,服务器程序就建立一个服务器分线程,处理客户端的命令。

如果客户端需要和服务器端进行文件的传输,则建立一个新的套接字连接来完成文件的操作。

编程技巧说明1.主函数设计在主函数中,完成服务器端口的侦听和服务线程的创建。

我们利用一个静态字符串变量initDir 来保存服务器线程运行时所在的工作目录。

服务器的初始工作目录是由程序运行时用户输入的,缺省为C盘的根目录。

具体的代码如下:public class extends Thread{private Socket socketClient;private int counter;private static String initDir;public static void main(String[] args){if(args.length != 0) {initDir = args[0];}else{ initDir = "c:";}int i = 1;try{System.out.println(" started!");//监听21号端口ServerSocket s = new ServerSocket(21);for(;;){//接受客户端请求Socket incoming = s.accept();//创建服务线程new (incoming,i).start();i++;}}catch(Exception e){}}2. 线程类的设计线程类的主要设计都是在run()方法中实现。

java学习案例-上传文件

java学习案例-上传文件

客户端向服务端上传文件【案例介绍】1.案例描述编写一个客户端向服务端上传文件的程序,要求使用TCP通信的的知识,将本地机器输入的路径下的文件上传到D盘中名称为upload的文件夹中。

并把客户端的IP地址加上count标识作为上传后文件的文件名,即IP(count)的形式。

其中,count随着文件的增多而增大,例如127.0.0.(1).jpg、127.0.0.(2).jpg。

2.效果显示上传文件之前上传文件之后【案例目标】●学会分析“文件上传”思路。

●根据思路独立完成“文件上传”任务的源代码编写、编译及运行。

●掌握网络通信中TCP协议的编程原理。

●掌握TCP网络通信ServerSocket和Socket的使用。

●掌握多线程的使用。

【案例分析】(1)根据任务描述中使用TCP通信的知识实现文件上传功能可知,要实现此功能,需要定义一个服务器接收文件的程序和一个客户端上传文件的程序。

(2)首先要编写服务器端程序来接收文件。

服务器端需要使用ServerSocket对象的accept()方法接收客户端的请求,由于一个服务器可能对于多个客户端,所以当客户端与服务器端简历连接后,服务器需要单独开启一个新的线程来处理与客户端的交互,这时需要在服务器端编写开启新线程的方法。

在新线程的方法中,需要获取客户端的端口号,并且使用输入输出流来传输文件到指定的目录中。

(3)编写客户端的功能代码,客户端功能的实现,因为是用户自己输入上传文件。

所以要定义键盘录入。

录入后需要使用Socket类来创建客户对象,并通过输入输出流来定义指定的文件。

(4)最后我们启动程序,先启动服务端程序,再运行客户端程序来测试上传的结果。

【案例实现】(1)首先编写服务器端的程序,用来接收文件,其代码具体如下所示。

FileServer.java1 package chapter0903;2 import java.io.File;3 import java.io.FileOutputStream;4 import java.io.InputStream;5 import java.io.OutputStream;6 import .ServerSocket;7 import .Socket;8 public class FileServer {9 public static void main(String[] args) throws Exception {10 //创建ServerSocket对象11 ServerSocket serverSocket = new ServerSocket(10001);12 while (true) {13 // 调用accept()方法接收客户端请求,得到Socket对象14 Socket s = serverSocket.accept();15 // 每当和客户端建立Socket连接后,单独开启一个线程处理和客户端的交互16 new Thread(new ServerThread(s)).start();17 }18 }19 }20 class ServerThread implements Runnable {21 // 持有一个Socket类型的属性22 private Socket socket;23 // 构造方法中把Socket对象作为实参传入24 public ServerThread(Socket socket) {25 this.socket = socket;26 }27 public void run() {28 // 获取客户端的IP地址29 String ip = socket.getInetAddress().getHostAddress();30 // 上传图片个数31 int count = 1;32 try {33 InputStream in = socket.getInputStream();34 // 创建上传图片目录的File对象35 File parentFile = new File("D:\\upload\\");36 // 如果不存在,就创建这个目录37 if (!parentFile.exists()) {38 parentFile.mkdir();39 }40 // 把客户端的IP地址作为上传文件的文件名41 File file = new File(parentFile, ip + "(" + count +42 ").jpg");43 while (file.exists()) {44 // 如果文件名存在,则把count++45 file = new File(parentFile, ip + "(" + (count++) +46 ").jpg");47 }48 // 创建FileOutputStream对象49 FileOutputStream fos = new FileOutputStream(file);50 // 定义一个字节数组51 byte[] buf = new byte[1024];52 // 定义一个int类型的变量len,初始值为053 int len = 0;54 // 循环读取数据55 while ((len = in.read(buf)) != -1) {56 fos.write(buf, 0, len);57 }58 // 获取服务端的输出流59 OutputStream out = socket.getOutputStream();60 // 上传成功后向客户端写出“上传成功”61 out.write("上传成功".getBytes());62 // 关闭输出流对象63 fos.close();64 // 关闭Socket对象65 socket.close();66 } catch (Exception e) {67 throw new RuntimeException(e);68 }69 }70 }运行结果如图所示。

java实现动态上传多个文件并解决文件重名问题

java实现动态上传多个文件并解决文件重名问题

java实现动态上传多个⽂件并解决⽂件重名问题本⽂分为两⼤⽅⾯进⾏讲解:⼀、java实现动态上传多个⽂件⼆、解决⽂件重命名问题java供⼤家参考,具体内容如下1、动态上传多个⽂件<form name="xx" action="<c:url value='/Up3Servlet'/>" method="post" enctype="multipart/form-data"><table id="tb" border="1"><tr><td>File:</td><td><input type="file" name="file"><button onclick="_del(this);">删除</button></td></tr></table><br/><input type="button" onclick="_submit();" value="上传"><input onclick="_add();" type="button" value="增加"></form></body><script type="text/javascript">function _add(){var tb = document.getElementById("tb");//写⼊⼀⾏var tr = tb.insertRow();//写⼊列var td = tr.insertCell();//写⼊数据td.innerHTML="File:";//再声明⼀个新的tdvar td2 = tr.insertCell();//写⼊⼀个inputtd2.innerHTML='<input type="file" name="file"/><button onclick="_del(this);">删除</button>';}function _del(btn){var tr = btn.parentNode.parentNode;//alert(tr.tagName);//获取tr在table中的下标var index = tr.rowIndex;//删除var tb = document.getElementById("tb");tb.deleteRow(index);}function _submit(){//遍历所的有⽂件var files = document.getElementsByName("file");if(files.length==0){alert("没有可以上传的⽂件");return false;}for(var i=0;i<files.length;i++){if(files[i].value==""){alert("第"+(i+1)+"个⽂件不能为空");return false;}}document.forms['xx'].submit();}</script></html>遍历所有要上传的⽂件2、解决⽂件的重名的问题package cn.hx.servlet;import java.io.File;import java.io.IOException;import java.io.PrintWriter;import java.util.ArrayList;import java.util.List;import java.util.UUID;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import mons.fileupload.FileItem;import mons.fileupload.disk.DiskFileItemFactory;import mons.fileupload.servlet.ServletFileUpload;import mons.io.FileUtils;public class UpImgServlet extends HttpServlet {public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {request.setCharacterEncoding("UTF-8");String path = getServletContext().getRealPath("/up");DiskFileItemFactory disk =new DiskFileItemFactory(1024*10,new File("d:/a"));ServletFileUpload up = new ServletFileUpload(disk);try{List<FileItem> list = up.parseRequest(request);//只接收图⽚*.jpg-iamge/jpege.,bmp/imge/bmp,png,List<String> imgs = new ArrayList<String>();for(FileItem file :list){if(file.getContentType().contains("image/")){String fileName = file.getName();fileName = fileName.substring(stIndexOf("\\")+1);//获取扩展String extName = fileName.substring(stIndexOf("."));//.jpg//UUIDString uuid = UUID.randomUUID().toString().replace("-", "");//新名称String newName = uuid+extName; //在这⾥⽤UUID来⽣成新的⽂件夹名字,这样就不会导致重名 FileUtils.copyInputStreamToFile(file.getInputStream(),new File(path+"/"+newName));//放到listimgs.add(newName);}file.delete();}request.setAttribute("imgs",imgs);request.getRequestDispatcher("/jsps/imgs.jsp").forward(request, response);}catch(Exception e){e.printStackTrace();}}}以上实现了java多⽂件上传,解决了⽂件重名问题,希望对⼤家的学习有所帮助。

java sftp 读写

java sftp 读写

java sftp 读写【最新版】目录1.Java SFTP 简介2.Java SFTP 读操作3.Java SFTP 写操作4.Java SFTP 应用实例正文【Java SFTP 简介】Java SFTP(Java Secure File Transfer Protocol)是 Java 中用于实现安全文件传输的一种协议。

与传统的 FTP 相比,SFTP 提供了更加安全的文件传输方式,可以有效防止数据在传输过程中的泄露、篡改等问题。

在 Java 语言中,可以通过 JSch 库来实现 SFTP 的读写操作。

【Java SFTP 读操作】Java SFTP 的读操作主要包括以下几种:1.连接 SFTP 服务器使用 JSch 库中的JSch.connect() 方法可以连接到 SFTP 服务器,需要提供服务器地址、端口、用户名和密码等信息。

2.获取远程目录列表通过调用 JSch.ls() 方法可以获取远程目录的列表,该方法会返回一个 FileList 对象,包含了远程目录中的所有文件和子目录。

3.读取文件内容使用 JSch.get() 方法可以读取远程文件的内容,该方法需要提供文件的路径,可以返回文件的内容。

【Java SFTP 写操作】Java SFTP 的写操作主要包括以下几种:1.上传文件通过调用 JSch.put() 方法可以上传文件到远程服务器,该方法需要提供本地文件路径和远程文件路径。

2.创建目录使用 JSch.mkdir() 方法可以创建远程目录,该方法需要提供目录的路径。

3.写入文件内容通过调用 JSch.write() 方法可以向远程文件写入内容,该方法需要提供文件的路径和要写入的内容。

【Java SFTP 应用实例】假设我们有一个 Java 应用程序,需要将本地文件 upload.txt 上传到远程服务器,并在上传成功后删除本地文件。

以下是一个简单的 Java SFTP 应用实例:```javaimport com.jcraft.jsch.Channel;import com.jcraft.jsch.ChannelSftp;import com.jcraft.jsch.JSch;import com.jcraft.jsch.Session;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;public class SFTPExample {public static void main(String[] args) {String host = "localhost";int port = 22;String user = "username";String password = "password";String localFilePath = "upload.txt";String remoteFilePath ="/path/to/remote/upload.txt";JSch jsch = new JSch();Session session = null;Channel channel = null;ChannelSftp channelSftp = null;try {// 连接 SFTP 服务器session = jsch.getSession(user, host, port);session.setPassword(password);session.setConfig("StrictHostKeyChecking", "no");session.connect();// 打开 SFTP 通道channel = session.openChannel("sftp");channel.connect();channelSftp = (ChannelSftp) channel;// 读取本地文件内容File localFile = new File(localFilePath);FileInputStream fis = newFileInputStream(localFile);byte[] buffer = new byte[1024];int len;while ((len = fis.read(buffer))!= -1) {channelSftp.put(remoteFilePath, buffer, 0, len);}// 关闭资源fis.close();channelSftp.exit();channel.disconnect();session.disconnect();// 删除本地文件localFile.delete();System.out.println("文件上传成功,本地文件已删除。

JAVA远程通讯技术及简单实现

JAVA远程通讯技术及简单实现
远程服务通讯,需要达到的目标是在一台计算机发起请求,另外一台机器在接收到请求 后进行相应的处理并将结果返回给请求端,这其中又会有诸如 one way request、同步请求、 异步请求等等请求方式,按照网络通信原理,需要实现这个需要做的就是将请求转换成流, 通过传输协议传输至远端,远端计算机在接收到请求的流后进行处理,处理完毕后将结果转 化为流,并通过传输协议返回给调用端。
10. * User: staratsky
11. * Date: 2008-8-7 22:03:35
12. * 创建 RMI 注册表,启动 RMI 服务,并将远程对象注册到 RMI 注册表中。
13. */
14. public class HelloRMIServer {
15. public static void main(String args[]) {
15.
* 因为 UnicastRemoteObject 的构造方法抛出了 RemoteException 异常,因此这里默认
的构造方法必须写,必须声明抛出 RemoteException
16.
17. 异常
18.
*
19.
* @throws RemoteException
20.
*/
21. public HelloRMIImpl() throws RemoteException {
16.
try {
17.
//创建一个远程对象
18.
HelloRMI rhello = new HelloRMIImpl();
19.
//本地主机上的远程对象注册表 Registry 的实例,并指定端口为 8888,这一步
必不可少(Java 默认端口是 1099),必不可缺的一

基于Java远程传输文件Tcp详细(源码+jar+exe)

基于Java远程传输文件Tcp详细(源码+jar+exe)

发送端/*2011*by小郭1•■远程文件传输import javax.swing.*;.*;import java.io.*;import java.awt.*;import java」ang.*;import java.awt.eve nt.*;public class TcpSend extends JFrame implements ActionListener {private J Button butt on;private JFileChooser chooser;//private FilelnputStream in;//private String filename;//byte[] by=new byte(lOOOOO);public TcpSend(){super("小郭文件传输发送端”);this.setBounds(10/10/400/400);this.setLayout(null);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.setResizable(false);this.setVisible(true);chooser=new JFileChooser();button=new JButton("发送J;button.setFont(new Font("楷体舄Font.PLAIN,30));button.setBounds(0,0z400,400);add(butt on);butt on .addActio nListener(this);}public void actionPerformed(ActionEvent e){chooser.showOpenDialog(this);if(chooser.showOpenDialog(this)==JFileChooser.CANCEL_OPTION)button.setText("MX消文件发送”);//小bug按2次才能取消return;}Send send=new Send(chooser.getSelectedFile());send.start();button.setText(H文件已发送”);}public static void main(String[] args){n ew TcpSe nd();}}//end TcpSendclass Send extends Thread{private File file;private Socket socket;private DataOutputStream Dout;private DatalnputStream Din;BufferedlnputStream buffered;Send(File file){this.file = file;try{llll);//localhost 可以改成IP 如果是内网直接填内socket= new Socket(l,localhost,,/网IP外网的话IP要映射buffered二new BufferedlnputStream(socket.getlnputStream());//创建一个缓冲区数组,保存套接字S输入流,以便使用Din = new DatalnputStream(buffered);//数据输入流,用来读取Dout = new DataOutputStream(socket.getOutputStream());〃数据输出流,用来写入由数据输入流读取的数据} catch (lOException e) {e.printStackTrace();}}public void run(){try{Dout.writeUTF(file.getName());// 将文件名写入输出流JOptionPane.showMessageDialogfnull/1发送的文件zu:,,+file.getName());boolean isAccepted = Din.readBoolean();//接收端是否读取输入字if(isAccepted),,对方已经接受文件传输,点击确左开始传//JOptionPane.showMessageDialog(nullz输!”);BufferedlnputStream Bin = new BufferedlnputStream(new FilelnputStream(file));//创建一个缓冲区数组,保存文件输入流byte[] by = new byte[lOOOOO];int I;while(( I =Bin.read(by))!= -1)//从输入流中将各字节读取到by数组中只要不是二1如果二1即到达流末尾就跳出循环{Dout・write(byOl);〃将by数组中从偏移地址0开始的1个字节写入输出流。

Java使用SMB读取远程文件遇到的问题

Java使用SMB读取远程文件遇到的问题

Java使⽤SMB读取远程⽂件遇到的问题前⾔ 最近在着⼿语⾳识别系统,⼤致的功能是将语⾳转成⽂本后对⽂本内容进⾏⼀系列的分析。

在⽂本分析的过程中,需要调⽤公司另⼀个哥们提供的python接⼝,分析过程⽣成的图⽚是保存在他⾃⼰的电脑上并将这个图⽚地址保存到数据库。

由于我本地不存在该图⽚,所以页⾯请求访问不到图⽚的资源。

于是,我打算在中间另加⼀道,远程读取他电脑上的图⽚⽂件并下载⾄我本地项⽬设置好的⽬录下。

注:在读取远程⽂件的过程中,确保⽂件所在的⽂件夹是共享的。

代码⽰例 ⾃⼰在⽤的代码我也懒的修改了,就直接贴上来了。

/*** 远程下载图⽚⾄本地⽬录* 仅解决⽬前图⽚和程序存储在不同服务器上的问题* 后期做修改* Created by zhh on 2017/11/14.*/public class ImagesDownloadUtils {private static Logger logger = LoggerFactory.getLogger(ImagesDownloadUtils.class);// 格式: smb://⽤户名:密码@机器ip/private static final String SMB_ROOT_PATH = "smb://Administrator:nlpqs@ip/";/*** 远程下载图⽚⾄本地⽬录* @param remotePath 远程⽂件路径例如:E:/WordCloudImgs/t7_1510645760.png* @return*/@SuppressWarnings("unused")public static String smbGet(String remotePath) {InputStream in = null;OutputStream out = null;try {// 剔除远程⽂件路径的根磁盘路径("共享⽂件路径: " + remotePath);// 去除磁盘根⽬录, E:/WordCloudImgs/t7_1510645760.png -> WordCloudImgs/t7_1510645760.pngremotePath = remotePath.substring(3);// 拼接远程共享⽂件路径remotePath = SMB_ROOT_PATH + remotePath;("⽂件远程路径: " + remotePath);// 本地存储路径(⾃⾏设置本机需要保存⽂件的路径)String localPath = MultipartFileOperation.createFolderByDate(ProjectConstant.FilePath.IMAGES);SmbFile remoteFile = new SmbFile(remotePath);if (remoteFile == null) {("共享⽂件不存在, 共享⽂件路径为: " + remotePath);return null;}String fileName = remoteFile.getName();String localFilePath = localPath + fileName;File localFile = new File(localFilePath);if (localFile.exists()) {("本地已存在该共享⽂件! ⽂件路径为: " + localFilePath);}in = new BufferedInputStream(new SmbFileInputStream(remoteFile));out = new BufferedOutputStream(new FileOutputStream(localFile));byte[] buffer = new byte[1024];while (in.read(buffer) != -1) {out.write(buffer);buffer = new byte[1024];}("共享⽂件下载成功!");("本地存储共享⽂件路径:" + localFilePath);return localFilePath;} catch (Exception e) {e.printStackTrace();("远程连接异常!");return null;} finally {try {if (out != null) {out.close();}if (in != null) {in.close();}} catch (IOException e) { e.printStackTrace(); }}}}12345678910111213141516171819202122232425262728293031323334353637383940414243444546475152535455565758596061626364656667686970 以上代码访问同事的机器是没什么问题的,为了简单起见把python服务移到了公司内部的服务器上。

Java远程传输文件(增加覆盖取消等功能)

Java远程传输文件(增加覆盖取消等功能)

发送端/ *by小郭*远程文件传输**/import javax.swing.*;import .*;import java.io.*;import java.awt.*;import ng.*;import java.awt.event.*;public class TcpSend extends JFrame implements ActionListener {private JButton button;private JFileChooser chooser;//private FileInputStream in;//private String filename;//byte[] by=new byte[100000];public TcpSend(){super("小郭文件传输发送端");this.setBounds(10,10,400,400);this.setLayout(null);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.setResizable(false);this.setVisible(true);chooser=new JFileChooser();button=new JButton("发送");button.setFont(new Font("楷体",Font.PLAIN,30));button.setBounds(0,0,400,400);add(button);button.addActionListener(this);}public void actionPerformed(ActionEvent e){chooser.showOpenDialog(this);if(chooser.showOpenDialog(this)==JFileChooser.CANCEL_OPTION) {button.setText("取消文件发送");//小bug 按2次才能取消return;}Send send=new Send(chooser.getSelectedFile());send.start();button.setText("文件已发送");}public static void main(String[] args){new TcpSend();}}//end TcpSendclass Send extends Thread{private File file;private Socket socket;private DataOutputStream Dout;private DataInputStream Din;BufferedInputStream buffered;Send(File file){this.file = file;try{socket= new Socket("localhost",1111);//localhost可以改成IP 如果是内网直接填内网IP 外网的话IP要映射buffered=new BufferedInputStream(socket.getInputStream());//创建一个缓冲区数组,保存套接字s输入流,以便使用Din = new DataInputStream(buffered);//数据输入流,用来读取Dout = new DataOutputStream(socket.getOutputStream());//数据输出流,用来写入由数据输入流读取的数据} catch (IOException e) {e.printStackTrace();}}public void run(){try{Dout.writeUTF(file.getName());//将文件名写入输出流JOptionPane.showMessageDialog(null,"发送的文件是:"+file.getName());boolean isAccepted = Din.readBoolean();//接收端是否读取输入字节if(isAccepted){// JOptionPane.showMessageDialog(null,"对方已经接受文件传输,点击确定开始传输!");BufferedInputStream Bin = new BufferedInputStream(new FileInputStream(file));//创建一个缓冲区数组,保存文件输入流byte[] by = new byte[100000];int l;while(( l =Bin.read(by))!= -1)//从输入流中将各字节读取到by数组中只要不是=-1 如果=-1即到达流末尾就跳出循环{Dout.write(by,0,l);//将by数组中从偏移地址0开始的1个字节写入输出流。

用Java实现基于SOAP的XML文档网络传输及远程过程调用

用Java实现基于SOAP的XML文档网络传输及远程过程调用

用Java实现基于SOAP的XML文档网络传输及远程过程调用1. 环境配置为了运行程序,我们首先务必配置好环境:共要下载四个软件包,它们都是开源免费的。

其中,前两个是Apache的,后两个是SUN网站的,如下所示:下载后将它们分别解压缩。

分别在这四个包的解压目录中找到:xerces.jar、soap.jar、mail.jar、activation.jar(JAF的),则是四个jar文件是我们所需要的。

本机安装环境:WindowsXP(SP2) + JDK1.4.2_06 + Tomcat5.0.28 + SOAP2.3.1 配置步骤:1、安装JDK与Tomcat。

过程比较简单,这里不再详述。

2、将刚才所找到的四个jar文件复制到Tomcat的“Tomcat 5.0\common\lib”目录下,这个目录是Tomcat的默认包目录,在这个目录中的所有包在Tomcat启动时都会被自动加载。

3、将\ JDK1.4.2\lib\路径下的tools.jar也复制到Tomcat的“Tomcat5.0\common\lib”目录下。

5、注意在编写程序时,需要将所得到的四个jar文件路径设置到所使用的Java编程环境中,由于在程序中需要用到其中的类文件。

具体步骤略。

6、重启Tomcat服务。

这时Tomcat会将“Tomcat 5.0\common\lib”目录下新加入的包加载到内存中。

到此,我们已经配置好了程序运行所需要的环境。

2. 基于SOAP的XML文档网络传输SOAP规范要紧定义了四个元素:SOAP信封规范,传输与协议绑定,编码规则与一个RPC协定。

用于实现消息的网络传输。

⏹SOAP信封规范,SOAP信封规范对计算机间传递的数据如何封装定义了具体的规则。

这包含应用特定的数据,如要调用的方法名,方法参数与返回值;还包含谁将处理封装内容,失败时如何编码错误消息等信息。

⏹数据编码规则,为了交换数据,计算机务必在编码特定数据类型的规则上达成一致,SOAP也有自己的一套编码数据类型的约定。

Java远程连接Linux服务器并执行命令及上传文件功能

Java远程连接Linux服务器并执行命令及上传文件功能

Java远程连接Linux服务器并执⾏命令及上传⽂件功能最近再开发中遇到需要将⽂件上传到Linux服务器上,⾄此整理代码笔记。

此种连接⽅法中有考虑到并发问题,在进⾏创建FTP连接的时候将每⼀个连接对象存放⾄ThreadLocal<Ftp> 中以确保每个线程之间对FTP的打开与关闭互不影响。

package com.test.utils;import java.io.BufferedInputStream;import java.io.File;import java.io.FileFilter;import java.io.FileInputStream;import java.io.InputStream;import java.util.ArrayList;import java.util.Date;import java.util.List;import mons.logging.Log;import mons.logging.LogFactory;import com.jcraft.jsch.ChannelSftp;import com.jcraft.jsch.JSch;import com.jcraft.jsch.Session;public class Ftp {//打印log⽇志private static final Log logger = LogFactory.getLog(Ftp.class);private static Date last_push_date = null;private Session sshSession;private ChannelSftp channel;private static ThreadLocal<Ftp> sftpLocal = new ThreadLocal<Ftp>();private Ftp(String host, int port, String username, String password) throws Exception {JSch jsch = new JSch();jsch.getSession(username, host, port);//根据⽤户名,密码,端⼝号获取sessionsshSession = jsch.getSession(username, host, port);sshSession.setPassword(password);//修改服务器/etc/ssh/sshd_config 中 GSSAPIAuthentication的值yes为no,解决⽤户不能远程登录sshSession.setConfig("userauth.gssapi-with-mic", "no");//为session对象设置properties,第⼀次访问服务器时不⽤输⼊yessshSession.setConfig("StrictHostKeyChecking", "no");sshSession.connect();//获取sftp通道channel = (ChannelSftp)sshSession.openChannel("sftp");channel.connect();("连接ftp成功!" + sshSession);}/*** 是否已连接** @return*/private boolean isConnected() {return null != channel && channel.isConnected();}/*** 获取本地线程存储的sftp客户端** @return* @throws Exception*/public static Ftp getSftpUtil(String host, int port, String username, String password) throws Exception {//获取本地线程Ftp sftpUtil = sftpLocal.get();if (null == sftpUtil || !sftpUtil.isConnected()) {//将新连接防⽌本地线程,实现并发处理sftpLocal.set(new Ftp(host, port, username, password));}return sftpLocal.get();}/*** 释放本地线程存储的sftp客户端*/public static void release() {if (null != sftpLocal.get()) {sftpLocal.get().closeChannel();("关闭连接" + sftpLocal.get().sshSession);sftpLocal.set(null);}}/*** 关闭通道** @throws Exception*/public void closeChannel() {if (null != channel) {try {channel.disconnect();} catch (Exception e) {logger.error("关闭SFTP通道发⽣异常:", e);}}if (null != sshSession) {try {sshSession.disconnect();} catch (Exception e) {logger.error("SFTP关闭 session异常:", e);}}}/*** @param directory 上传ftp的⽬录* @param uploadFile 本地⽂件⽬录**/public void upload(String directory, String uploadFile) throws Exception {try {<br> //执⾏列表展⽰ls 命令channel.ls(directory);<br> //执⾏盘符切换cd 命令channel.cd(directory);List<File> files = getFiles(uploadFile, new ArrayList<File>());for (int i = 0; i < files.size(); i++) {File file = files.get(i);InputStream input = new BufferedInputStream(new FileInputStream(file)); channel.put(input, file.getName());try {if (input != null) input.close();} catch (Exception e) {e.printStackTrace();logger.error(file.getName() + "关闭⽂件时.....异常!" + e.getMessage()); }if (file.exists()) {boolean b = file.delete();(file.getName() + "⽂件上传完毕!删除标识:" + b);}}}catch (Exception e) {logger.error("【⼦⽬录创建中】:",e);//创建⼦⽬录channel.mkdir(directory);}}//获取⽂件public List<File> getFiles(String realpath, List<File> files) {File realFile = new File(realpath);if (realFile.isDirectory()) {File[] subfiles = realFile.listFiles(new FileFilter() {@Overridepublic boolean accept(File file) {if (null == last_push_date ) {return true;} else {long modifyDate = stModified();return modifyDate > last_push_date.getTime();}}});for (File file : subfiles) {if (file.isDirectory()) {getFiles(file.getAbsolutePath(), files);} else {files.add(file);}if (null == last_push_date) {last_push_date = new Date(stModified());} else {long modifyDate = stModified();if (modifyDate > last_push_date.getTime()) {last_push_date = new Date(modifyDate);}}}}return files;}}总结以上所述是⼩编给⼤家介绍的Java远程连接Linux服务器并执⾏命令及上传⽂件,希望对⼤家有所帮助如果⼤家有任何疑问欢迎给我留⾔,⼩编会及时回复⼤家的!。

Java实现跨服务器上传文件功能

Java实现跨服务器上传文件功能

Java实现跨服务器上传⽂件功能前⼏天做个项⽬,本⾝客户端和管理员端是写在⼀起的,共⽤⼀台服务器,客户上传的⽂件都是存在服务器的硬盘上的。

⽼龙提出要把客户端和管理员端分离,这时候⽤户上传的附件的存储就出现问题了。

显然,把⼤到⼏百M的apk⽂件存到数据库不现实,查了半天,在两端建⽴ftp服务器传⽂件是最快的⽅法。

具体流程是,⽤户登录外⽹客户端,上传⽂件到外⽹的服务器硬盘上,在此同时,⽂件通过外⽹服务器访问内⽹管理员服务器的ftp服务器,传到内⽹服务器的硬盘上。

这样内⽹服务器可以对上传的⽂件进⾏加密签名⼯作,之后也通过ftp的⽅式把⽂件回传到外⽹服务器硬盘上,供⽤户进⾏其他操作。

具体实现时⽤到的⼯具:Serv-U。

Serv-U是⼀个⽅便我们在windows上建⽴ftp服务器的⼯具。

下载破解后,按照步骤,设置好Ip、端⼝、账户密码、允许ftp访问的磁盘路径、操作权限等,就可以使⽤了。

IP在本机测试的时候就选127.0.0.1,内⽹测试时就选192.168.0.x。

在java项⽬中的实现,我⾃⼰写了个⼯具类,⽤到了apache的commons-net包,有上传,下载以及删除功能。

附上代码:package app.ftp;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import .ftp.FTPClient;import .ftp.FTPFile;import .ftp.FTPReply;/*** FTP服务器⼯具类**/public class FTPUtils {/*** 上传⽂件⾄FTP服务器** @param url* 服务器IP地址* @param port* 服务器端⼝* @param userName* ⽤户登录名* @param password* ⽤户登录密码* @param storePath* 服务器⽂件存储路径* @param fileName* 服务器⽂件存储名称* @param is* ⽂件输⼊流* @return* <b>true</b>:上传成功* <br/>* <b>false</b>:上传失败*/public static boolean storeFile (String url, int port, String userName, String password, String storePath, String fileName, InputStream is) {boolean result = false;FTPClient ftp = new FTPClient();try {// 连接⾄服务器,端⼝默认为21时,可直接通过URL连接ftp.connect(url ,port);// 登录服务器ftp.login(userName, password);// 判断返回码是否合法if (!FTPReply.isPositiveCompletion(ftp.getReplyCode())) {// 不合法时断开连接ftp.disconnect();// 结束程序return result;}// 判断ftp⽬录是否存在,如果不存在则创建⽬录,包括创建多级⽬录String s = "/"+storePath;String[] dirs = s.split("/");ftp.changeWorkingDirectory("/");//按顺序检查⽬录是否存在,不存在则创建⽬录for(int i=1; dirs!=null&&i<dirs.length; i++) {if(!ftp.changeWorkingDirectory(dirs[i])) {if(ftp.makeDirectory(dirs[i])) {if(!ftp.changeWorkingDirectory(dirs[i])) {return false;}}else {return false;}}}// 设置⽂件操作⽬录ftp.changeWorkingDirectory(storePath);// 设置⽂件类型,⼆进制ftp.setFileType(FTPClient.BINARY_FILE_TYPE);// 设置缓冲区⼤⼩ftp.setBufferSize(3072);// 上传⽂件result = ftp.storeFile(fileName, is);// 关闭输⼊流is.close();// 登出服务器ftp.logout();} catch (IOException e) {e.printStackTrace();} finally {try {// 判断输⼊流是否存在if (null != is) {// 关闭输⼊流is.close();}// 判断连接是否存在if (ftp.isConnected()) {// 断开连接ftp.disconnect();}} catch (IOException e) {e.printStackTrace();}}return result;}/*** 从FTP服务器下载⽂件⾄本地** @param url* 服务器IP地址* @param port* 服务器端⼝* @param userName* ⽤户登录名* @param password* ⽤户登录密码* @param remotePath* 服务器⽂件存储路径* @param fileName* 服务器⽂件存储名称* @param localPath* 本地⽂件存储路径* @return* <b>true</b>:下载成功* <br/>* <b>false</b>:下载失败*/public static boolean retrieveFile (String url, int port, String userName, String password, String remotePath, String fileName, String localPath) { boolean result = false;FTPClient ftp = new FTPClient();OutputStream os = null;try {// 连接⾄服务器,端⼝默认为21时,可直接通过URL连接 ftp.connect(url ,port);// 登录服务器ftp.login(userName, password);// 判断返回码是否合法if (!FTPReply.isPositiveCompletion(ftp.getReplyCode())) { // 不合法时断开连接ftp.disconnect();// 结束程序return result;}// 设置⽂件操作⽬录ftp.changeWorkingDirectory(remotePath);// 设置⽂件类型,⼆进制ftp.setFileType(FTPClient.BINARY_FILE_TYPE);// 设置缓冲区⼤⼩ftp.setBufferSize(3072);// 设置字符编码ftp.setControlEncoding("UTF-8");// 构造本地⽂件对象File localFile = new File(localPath + "/" + fileName);// 获取⽂件操作⽬录下所有⽂件名称String[] remoteNames = ftp.listNames();// 循环⽐对⽂件名称,判断是否含有当前要下载的⽂件名 for (String remoteName: remoteNames) {if (fileName.equals(remoteName)) {result = true;}}// ⽂件名称⽐对成功时,进⼊下载流程if (result) {// 构造⽂件输出流os = new FileOutputStream(localFile);// 下载⽂件result = ftp.retrieveFile(fileName, os);// 关闭输出流os.close();}// 登出服务器ftp.logout();} catch (IOException e) {e.printStackTrace();} finally {try {// 判断输出流是否存在if (null != os) {// 关闭输出流os.close();}// 判断连接是否存在if (ftp.isConnected()) {// 断开连接ftp.disconnect();}} catch (IOException e) {e.printStackTrace();}}return result;}/*** 从FTP服务器删除⽂件** @param url* 服务器IP地址* @param port* 服务器端⼝* @param userName* ⽤户登录名* @param password* ⽤户登录密码* @param remotePath* 服务器⽂件存储路径* @param fileName* 服务器⽂件存储名称* @return* <b>true</b>:删除成功* <br/>* <b>false</b>:删除失败*/public static boolean deleteFile (String url, int port, String userName, String password, String remotePath, String fileName) {boolean result = false;FTPClient ftp = new FTPClient();try {// 连接⾄服务器,端⼝默认为21时,可直接通过URL连接ftp.connect(url ,port);// 登录服务器ftp.login(userName, password);// 判断返回码是否合法if (!FTPReply.isPositiveCompletion(ftp.getReplyCode())) {// 不合法时断开连接ftp.disconnect();// 结束程序return result;}// 设置⽂件操作⽬录ftp.changeWorkingDirectory(remotePath);// 设置⽂件类型,⼆进制ftp.setFileType(FTPClient.BINARY_FILE_TYPE);// 设置缓冲区⼤⼩ftp.setBufferSize(3072);// 设置字符编码ftp.setControlEncoding("UTF-8");// 获取⽂件操作⽬录下所有⽂件名称String[] remoteNames = ftp.listNames();// 循环⽐对⽂件名称,判断是否含有当前要下载的⽂件名for (String remoteName: remoteNames) {if (fileName.equals(remoteName)) {result = true;}}// ⽂件名称⽐对成功时,进⼊删除流程if (result) {// 删除⽂件result = ftp.deleteFile(fileName);}// 登出服务器ftp.logout();} catch (IOException e) {e.printStackTrace();} finally {try {// 判断连接是否存在if (ftp.isConnected()) {// 断开连接ftp.disconnect();}} catch (IOException e) {e.printStackTrace();}}return result;}public static void main(String[] args) throws FileNotFoundException {// try {// FileInputStream fis = new FileInputStream(new File("D:/Soft Storage/软件⼯具箱/HTML_Help_WorkShop_1.3_XiaZaiBa.zip"));// System.out.println(storeFile("192.168.1.2", 21, "admin", "1", "C:/Documents and Settings/Administrator/桌⾯", RandomUUID.random() + ".zip", fis)); // } catch (FileNotFoundException e) {// e.printStackTrace();// }////File file = new File("C:/Users/freed/Desktop/1.txt");//InputStream is = new FileInputStream(file);//System.out.println(storeFile("127.0.0.1", 21, "feili", "feili", "examples", "2.txt", is));//System.out.println(retrieveFile("127.0.0.1", 21, "feili", "feili", "examples/jsp", "index.html", "C:/Users/freed/Desktop"));//System.out.println(deleteFile("127.0.0.1", 21, "feili", "feili", "testpath", "1.txt"));}}需要注意的是上传⽂件的时候要将File⽂件先放⼊fileinputstream中。

Java执行linuxscp远程获取文件和上传

Java执行linuxscp远程获取文件和上传

Java执⾏linuxscp远程获取⽂件和上传需要的jar包:ganymed-ssh2-build210.jarimport java.io.ByteArrayOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;import java.util.logging.Level;import java.util.logging.Logger;import ch.ethz.ssh2.Connection;import ch.ethz.ssh2.SCPClient;public class Scpclient {// public Scpclient(){}static private Scpclient instance;static synchronized public Scpclient getInstance(String IP, int port,String username, String passward) {if (instance == null) {instance = new Scpclient(IP, port, username, passward);}return instance;}public Scpclient(String IP, int port, String username, String passward) {this.ip = IP;this.port = port;ername = username;this.password = passward;}public void getFile(String remoteFile, String localTargetDirectory) {Connection conn = new Connection(ip,port);try {conn.connect();boolean isAuthenticated = conn.authenticateWithPassword(username,password);if (isAuthenticated == false) {System.err.println("authentication failed");}SCPClient client = new SCPClient(conn);client.get(remoteFile, localTargetDirectory);conn.close();} catch (IOException ex) {Logger.getLogger(SCPClient.class.getName()).log(Level.SEVERE, null,ex);}}public void putFile(String localFile, String remoteTargetDirectory) {Connection conn = new Connection(ip,port);try {conn.connect();boolean isAuthenticated = conn.authenticateWithPassword(username,password);if (isAuthenticated == false) {System.err.println("authentication failed");}SCPClient client = new SCPClient(conn);client.put(localFile, remoteTargetDirectory);conn.close();} catch (IOException ex) {Logger.getLogger(SCPClient.class.getName()).log(Level.SEVERE, null,ex);}}public void putFile(String localFile, String remoteFileName,String remoteTargetDirectory,String mode) { Connection conn = new Connection(ip,port);try {conn.connect();boolean isAuthenticated = conn.authenticateWithPassword(username,password);if (isAuthenticated == false) {System.err.println("authentication failed");}SCPClient client = new SCPClient(conn);if((mode == null) || (mode.length() == 0)){mode = "0600";}client.put(localFile, remoteFileName, remoteTargetDirectory, mode);//重命名ch.ethz.ssh2.Session sess = conn.openSession();String tmpPathName = remoteTargetDirectory +File.separator+ remoteFileName;String newPathName = tmpPathName.substring(0, stIndexOf("."));sess.execCommand("mv " + remoteFileName + " " + newPathName);//重命名回来conn.close();} catch (IOException ex) {Logger.getLogger(SCPClient.class.getName()).log(Level.SEVERE, null,ex);}}// public void putFile(String localFile, String remoteFileName,String remoteTargetDirectory) {// Connection conn = new Connection(ip,port);// try {// conn.connect();// boolean isAuthenticated = conn.authenticateWithPassword(username,// password);// if (isAuthenticated == false) {// System.err.println("authentication failed");// }// SCPClient client = new SCPClient(conn);// client.put(getBytes(localFile), remoteFileName, remoteTargetDirectory);// conn.close();// } catch (IOException ex) {// Logger.getLogger(SCPClient.class.getName()).log(Level.SEVERE, null,ex);// }// }public static byte[] getBytes(String filePath) {byte[] buffer = null;try {File file = new File(filePath);FileInputStream fis = new FileInputStream(file);ByteArrayOutputStream byteArray = new ByteArrayOutputStream(1024*1024);byte[] b = new byte[1024*1024];int i;while ((i = fis.read(b)) != -1) {byteArray.write(b, 0, i);}fis.close();byteArray.close();buffer = byteArray.toByteArray();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return buffer;}private String ip;private int port;private String username;private String password;public String getUsername() {return username;}public void setUsername(String username) {ername = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public int getPort() {return port;}public void setPort(int port) {this.port = port;}}调⽤⽅法:Scpclient scp = Scpclient.getInstance(ip, port,uname,pwd);scp.putFile("本地⽂件路径", fileFeed.getName()+".tmp", "推送⽂件,到服务器的⽬录路径", null); scp.getFile(remoteFile, localTargetDirectory);。

基于java的远程登录和文件传输功能的实现

基于java的远程登录和文件传输功能的实现

基于java的远程登录和文件传输功能的实现摘要Internet发展至今产生了两种比较重要的网络体系结构:ISO/OSI和TCP/IP参考模型,ISO/OSI模型有7层:物理层,数据链路层,网络层,传输层,会话层,表示层,应用层。

而TCP/IP模型只有4层:主机至网络层,互连网层,传输层,应用层。

其中TCP/IP 参考模型中的应用层包含所有的高层协议,最早引入的是虚拟终端协议,文件传输协议和电子邮件协议。

本文对网络计算机相互通信的机理进行比较细致和深入的分析,并采用java编程工具实现了远程登录和文件传输的功能。

关键词:TCP/IP JAVA 远程登录文件传输AbstractInternet produces two kinds of more important network system structure so far that Internet is developed, ISO/OSI and TCP/IP consult models, ISO/OSI model is 7 layers: Physics layer, data link layer, network layer, transport layer, session layer, persentaltion layer, opplication layer. And TCP/IP model is 4 layers: From host computer to Internet, network layer, transport layer, opplication layer. TCP/IP among them consult application layer of model include all on the senior level Protocol, introduce TELecommunications NETwork , File Transfer Protocol and Simple Mail Transfer Protocol, Careful and deep analysis that this text compares mechanism that the network computer communicates each other, and adopt java programming tool to realize the functions of telecommunications network and file transfer.KEY WORDS: TCP/IP JA V A TELNET FTP目录前言--------------------------------------------------------------------------------------------1 第一章互联网概述---------------------------------------------------------------------- 3 1.1 互联网的发展状况--------------------------------------------------------------------3 1.2 互联网的应用-------------------------------------------------------------------------5第二章互联网中两种重要的参考模型-----------------------------------------------6 2.1 OSI参考模型-------------------------------------------------------------------------6 2.2 TCP/IP参考模型--------------------------------------------------------------------8第3章远程登录的功能实现----------------------------------------------------------------9 3.1 虚拟终端-------------------------------------------------------------------------------9 3.2 远程登录协议 --------------------------------------------------------------------------11 3.3 有关远程登录的实现方法(线程的概念)---------------------------------------13 3.4 远程登录的最终完成---------------------------------------------------------------18 第4章文件传输的执行行为和功能------------------------------------------------------27 4.1传输文件--------------------------------------------------------------------------------27 4.2 文件传输的传输模式----------------------------------------------------------------28 4.3 构造控制连接和数据连接------------------------------------------------------------32 4.4 文件传输程序的完成-----------------------------------------------------------------42 第5章总结----------------------------------------------------------------------------------53 参考文献---------------------------------------------------------------------------------------54 谢辞----------------------------------------------------------------------------------------55前言历史的发展表明I n t e r n e t的产生要追溯到最开始的时间,穴壁上的画、烟信号、驿站—所有这些通信方式都使我们的祖先一直在考虑一个更好的通信方式。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

发送端/*2011*by小郭*远程文件传输**/import javax.swing.*;import .*;import java.io.*;import java.awt.*;import ng.*;import java.awt.event.*;public class TcpSend extends JFrame implements ActionListener {private JButton button;private JFileChooser chooser;//private FileInputStream in;//private String filename;//byte[] by=new byte[100000];public TcpSend(){super("小郭文件传输发送端");this.setBounds(10,10,400,400);this.setLayout(null);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.setResizable(false);this.setVisible(true);chooser=new JFileChooser();button=new JButton("发送");button.setFont(new Font("楷体",Font.PLAIN,30));button.setBounds(0,0,400,400);add(button);button.addActionListener(this);}public void actionPerformed(ActionEvent e){chooser.showOpenDialog(this);if(chooser.showOpenDialog(this)==JFileChooser.CANCEL_OPTION){button.setText("取消文件发送");//小bug 按2次才能取消return;}Send send=new Send(chooser.getSelectedFile());send.start();button.setText("文件已发送");}public static void main(String[] args){new TcpSend();}}//end TcpSendclass Send extends Thread{private File file;private Socket socket;private DataOutputStream Dout;private DataInputStream Din;BufferedInputStream buffered;Send(File file){this.file = file;try{socket= new Socket("localhost",1111);//localhost可以改成IP 如果是内网直接填内网IP 外网的话IP要映射buffered=new BufferedInputStream(socket.getInputStream());//创建一个缓冲区数组,保存套接字s输入流,以便使用Din = new DataInputStream(buffered);//数据输入流,用来读取Dout = new DataOutputStream(socket.getOutputStream());//数据输出流,用来写入由数据输入流读取的数据} catch (IOException e) {e.printStackTrace();}}public void run(){try{Dout.writeUTF(file.getName());//将文件名写入输出流JOptionPane.showMessageDialog(null,"发送的文件是:"+file.getName());boolean isAccepted = Din.readBoolean();//接收端是否读取输入字节if(isAccepted){// JOptionPane.showMessageDialog(null,"对方已经接受文件传输,点击确定开始传输!");BufferedInputStream Bin = new BufferedInputStream(new FileInputStream(file));//创建一个缓冲区数组,保存文件输入流byte[] by = new byte[100000];int l;while(( l =Bin.read(by))!= -1)//从输入流中将各字节读取到by数组中只要不是=-1 如果=-1即到达流末尾就跳出循环{Dout.write(by,0,l);//将by数组中从偏移地址0开始的1个字节写入输出流。

Dout.flush();//清空数据输出流//l = Bin.read(by);多了这一句照成接收的文件大小只有一半的容量}Bin.close();//关闭缓冲输入流// JOptionPane.showMessageDialog(null,file.toString()+"\n文件发送完毕!");}//end if}//end trycatch (IOException e){e.printStackTrace();}finally//保证即使因为异常,try里面的代码不会被执行,但是finally里面的语句还是会执行,这样可以释放一些资源{try{Din.close();//关闭数据输入流Dout.close();//关闭数据输出流socket.close();}catch (IOException e){e.printStackTrace();}}//end finally}//end run()}//end Send(线程类)接收端import javax.swing.*;import .*;import java.io.*;import java.awt.*;import ng.*;import java.awt.event.*;public class TcpReceive extends JFrame implements ActionListener {private JButton button1,button2;private JLabel label;private Socket socket;private ServerSocket ss;private String filename;public TcpReceive(){super("小郭文件传输接收端");this.setBounds(420,420,400,400);setLayout(null);setVisible(true);this.setResizable(false);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);label=new JLabel();label.setText("暂时没收到文件请求,请等待。

");button1=new JButton("Accept");button2=new JButton("Cancel");add(label);add(button1);add(button2);label.setBounds(10,10,300,300);button1.setBounds(60,310,100,30);button2.setBounds(240,310,100,30);button1.addActionListener(this);button2.addActionListener(this);try{ss=new ServerSocket(1111);//绑定到端口1111的服务器套接字while(!ss.isClosed()){socket=ss.accept();//侦听并接受到此套接字的连接DataInputStream Din = new DataInputStream(socket.getInputStream());//数据输入流,用来读取从1111端口接收到的输入流filename = Din.readUTF();//读取对方发过来的字符串(即文件名)label.setText(filename);}}catch (IOException e){if(ss.isClosed())//端口关闭就退出{JOptionPane.showMessageDialog(this,"端口已关闭,程序退出");System.exit(0);}else{ e.printStackTrace();}}}//end构造函数public void actionPerformed(ActionEvent e){if(e.getSource()==button1){JFileChooser chooser=new JFileChooser();chooser.setSelectedFile(new File(filename));//路径抽象化chooser.showSaveDialog(this);chooser.getName(chooser.getSelectedFile());Receive receive = new Receive(chooser.getSelectedFile(),socket);//创建Receive线程对象用来启动线程类if(chooser.showSaveDialog(this)==JFileChooser.APPROVE_OPTION)//bug:按2次保存才保存下来{//System.out.println("bbb");if(chooser.getSelectedFile().exists())//测试此抽象路径名表示的文件或目录是否存在{int over=JOptionPane.showConfirmDialog(this,"文件"+chooser.getSelectedFile().getName()+"已经存在,确定覆盖吗?","覆盖与否", JOptionPane.YES_NO_OPTION,JOptionPane.WARNING_MESSAGE);if(over==JOptionPane.YES_OPTION)//bug:按2次确定才能执行{//else{System.out.println("aaa");}receive.start();}//end if}//end ifelse{receive.start();} //System.out.println("aaaa");} //bug:按2次取消才能取消第二次取消才打印}//end if}//end ifif(e.getSource()==button2){if(label.getText()=="暂时没收到文件请求,请等待。

相关文档
最新文档