这里我是创建3个Java类:
Client(客户端)
Server(服务端)
DataUtil(工具类)
介绍:对d盘根目录下一个文件进行上传并下载到d:\ud文件夹中
步骤一:Server(服务端)
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Random;
public class Server {
public static void main(String[] args) throws Exception {
//创建一个服务端,端口号为9999
ServerSocket serverSocket = new ServerSocket(9999);
System.out.println("文件服务器开启------");
//获得一个客户端的连接
Socket socket = serverSocket.accept();
//文件的命名规则:域名+毫秒值+随机数,后面在加上文件的类型
String fileName = "itcast"+System.currentTimeMillis()+new Random().nextInt(999999)+".jpg";
//Server端获取文件,实现的内容在工具类里面写,这里直接调用方法
//如果不用随机命名的方法,而是指定命名,如生成一个名字为2.jpg的文件,就用下面方法
//DataUtil.RecevieFile(socket,"2.jpg");
DataUtil.RecevieFile(socket,fileName);
}
}
步骤二:Client(客户端)
import java.net.Socket;
public class Client {
public static void main(String[] args) throws Exception {
//客户端
Socket socket = new Socket("127.0.0.1",9999);
//被操作的原文件为d盘根目录下的1.jpg
DataUtil.SendFile(socket,"d:\\1.jpg");
}
}
步骤三:DataUtil(工具类) 用于实现客户端以及服务端的功能,对输入流,输出流进行操作
import java.io.*;
import java.net.Socket;
public class DataUtil {
//该方法用于服务端,服务端接收到客户端的请求accept后,调用该方法回应客户端生成一个文件
public static void RecevieFile(Socket socket,String filename){
//生成输出一个文件,使用fos流,这里需要用is流获取数据,获取数据后才能输出一个文件
try {
//使用Socket对象中的方法getInputStream,获取到网络字节输入流InputStream对象
InputStream is = socket.getInputStream();
//判断d:\\ud文件夹是否存在,不存在则创建
File file = new File("d:\\ud");
if(!file.exists())
file.mkdirs();
//创建输出一个文件,构造方法中绑定要输出的目的地
FileOutputStream fos = new FileOutputStream(file+"\\"+filename);
int len = 0;
byte []arr = new byte[1024];
// 判断是否为最后一个字节,是的话结束循环
while ((len=is.read(arr))!=-1){
//使用本地字节输出流FileOutputStream对象中的方法write,把读取到的文件保存到服务器的硬盘上
fos.write(arr,0,len);
}
//使用网络字节输出流OutputStream对象中的方法write,给客户端回写"上传成功"
socket.getOutputStream().write("上传成功".getBytes());
//关流
fos.close();
socket.close();
//is.close();
} catch (IOException e) {
e.printStackTrace();
}
//用于客户端,客户端发送一个请求,上传源文件
}
public static void SendFile(Socket socket,String filename){
try {
//用fis流读取源文件,并对读取的数据用os流进行输出到服务器
FileInputStream fis = new FileInputStream(filename);
OutputStream os = socket.getOutputStream();
int len =0;
byte arr[] = new byte[1024];
while ((len=fis.read(arr))!=-1){
os.write(arr,0,len);
//把读取到的内容上传到服务器
}
//上传完文件,给服务器写一个结束标记
socket.shutdownOutput();
//读取回写的内容,相应之前的"上传成功"
InputStream is = socket.getInputStream();
while ((len=is.read(arr))!=-1)
System.out.println(new String(arr,0,len));
//关流
//while里面条件是到-1,但实际是没有-1,不关流就会一直等待,可能会报错
fis.close();
socket.close();
//os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
运行的时候,先运行Server端,再运行Client端。
因为这里没有用到多线程,所以传输文件只能一个,超过一个的话会报错。如果要传输多个的话,可以在服务端对accept方法进行while循环,再使用多线程的方法。
参考博客:实现文件上传和下载