Java远程传输文件(增加覆盖取消等功能)
- 格式:docx
- 大小:18.93 KB
- 文档页数:8
一、介绍随着信息化时代的到来,数据传输变得越来越重要。
在企业中,有时候需要通过网络将数据从一个服务器传输到另一个服务器。
而其中一种常用的数据传输协议就是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 微服务架构中,文件传输可能受到一些问题的影响,例如文件失真、损坏或数据丢失。
以下是一些排查和处理文件传输问题的常见方案: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传输文件方案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实现两台电脑间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。
这些体系的⼦类都以⽗类名作为后缀,⽽⼦类名的前缀就是该对象的功能。
类型:课程设计基于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 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服务器应用的详细讲解【文章摘要】根据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()方法中实现。
客户端向服务端上传文件【案例介绍】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供⼤家参考,具体内容如下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 读写【最新版】目录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("文件上传成功,本地文件已删除。
发送端/*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读取远程⽂件遇到的问题前⾔ 最近在着⼿语⾳识别系统,⼤致的功能是将语⾳转成⽂本后对⽂本内容进⾏⼀系列的分析。
在⽂本分析的过程中,需要调⽤公司另⼀个哥们提供的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服务移到了公司内部的服务器上。
发送端/ *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文档网络传输及远程过程调用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服务器并执⾏命令及上传⽂件功能最近再开发中遇到需要将⽂件上传到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服务器并执⾏命令及上传⽂件,希望对⼤家有所帮助如果⼤家有任何疑问欢迎给我留⾔,⼩编会及时回复⼤家的!。
发送端/*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()=="暂时没收到文件请求,请等待。