问题描述:将本地文件上传(需将文件名一起上传)至指定服务器,服务器将上传的文件保存至指定路径下并文件名添加前缀 "Downlod_原文件名"。
思路: 客户端需要一个输入流来读取本地文件内容和文件名;需要一个输出流将读取的文件名发送至服务器端,然后再将内容发送至服务器端。
服务器端需要一个输入流读取文件名和内容,需要一个输出流将读取到的文件名添加前缀并将内容保存至指定路径即可;
客户端示例代码:
1 package Datagram; 2 3 import java.io.File; 4 import java.io.FileInputStream; 5 import java.io.OutputStream; 6 import java.net.InetSocketAddress; 7 import java.net.Socket; 8 9 /* 10 * 客户端上传本地文件和文件名至指定服务器上 11 */ 12 public class FileUploadDemo { 13 public static void main(String[] args) throws Exception { 14 //创建客户端套接字对象 15 Socket s = new Socket(); 16 //绑定发送的服务器地址和端口 17 InetSocketAddress isa = new InetSocketAddress("localhost", 8080); 18 //发起连接 19 s.connect(isa); 20 //获取输出流 21 OutputStream os= s.getOutputStream(); 22 //查找指定文件 23 File file = new File("D:\\test.jpg"); 24 //获取文件名 25 String fileName = file.getName(); 26 //创建文件输入流 27 FileInputStream fis = new FileInputStream(file); 28 //写入文件长度(方便在服务端接收是需要知道传递的字节长度) 29 os.write(fileName.length()); 30 //写入文件名 31 os.write(fileName.getBytes()); 32 //读取指定文件内容 33 int len = -1; 34 byte[] by = new byte[1024]; 35 while((len=fis.read(by))!=-1){ 36 //将文件内容写入输出流中 37 os.write(by,0,len); 38 } 39 //禁掉输出流 40 s.shutdownOutput(); 41 //关流 42 s.close(); 43 fis.close(); 44 os.close(); 45 46 } 47 }
服务器端示例代码:
1 package Datagram; 2 3 import java.io.FileOutputStream; 4 import java.io.InputStream; 5 import java.net.ServerSocket; 6 import java.net.Socket; 7 8 /* 9 * 服务器端接收客户端发送的文件并保存该文件 10 */ 11 public class FileDownloadDemo { 12 public static void main(String[] args) throws Exception { 13 //创建服务端套接字对象 14 ServerSocket ss = new ServerSocket(8080); 15 //监听连接并接收连接 16 Socket s = ss.accept(); 17 //获取输入流对象 18 InputStream is = s.getInputStream(); 19 //对文件名的长度 20 int fileNameLength = is.read(); 21 //按照读出的文件名的长度来存入字节数组 22 byte[] by = new byte[fileNameLength]; 23 //按传递的文件名长度读取一次便得到的既是文件名 24 is.read(by); 25 26 String fileName = new String(by); 27 //创建输出流并更改输出的文件名 28 FileOutputStream fis = new FileOutputStream("D:\\Downlod_"+fileName); 29 //读取文件 30 int len =-1; 31 by = new byte[1024]; 32 while((len=is.read(by))!=-1){ 33 //将读取到的数据写入输出流 34 fis.write(by,0,len); 35 } 36 //禁掉输入流 37 s.shutdownInput(); 38 //关流 39 fis.close(); 40 is.close(); 41 42 } 43 }
时间: 2024-10-09 22:18:53