在本地有两个文件夹Client和Server,把Client文件夹中的文件复制到Server文件夹中。
客户端通过文件输入流接收到源路径文件的信息,把信息通过网络输出流传给服务器
客户端通过网络输入流接收客户端传来的文件信息,然后用文件输出流把信息写出的目的路径
package com.gongsi.cn.test1;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
//服务器把文件存在目的路径
//需要先返回一个确认信息再进行传输
public class Server {
public static void main(String[] args) throws Exception {
//1.创建连接
ServerSocket serverSocket=new ServerSocket(9999);
System.out.println("服务器正在打开!!");
Socket socket=serverSocket.accept();
//2.创建输入输出流
InputStream is = socket.getInputStream();
OutputStream os = socket.getOutputStream();
//3.接收信息
byte[] buff=new byte[1024];
int cnt=0;
cnt=is.read(buff);
String msg;
if (cnt>0) {
msg=new String(buff,0,cnt);
System.out.println("服务器收到命令...");
String[] s=msg.split(",");
String fileName=s[0];
int fileSize =Integer.valueOf(s[1]);
//假设正在根据传入的信息判断能不能进行传输,能传输则传过去一个OK
System.out.println("服务器接收到[文件名,文件大小]:" + msg);
os.write("OK".getBytes());
//接收文件,并且上传到目的路径
receiveFile(is,fileName,fileSize);
}
}
//接收文件,并且上传到目的路径
private static void receiveFile(InputStream is,String fileName,int fileSize) throws Exception {
//先用网络输入流接收文件的信息
byte[] buff=new byte[1024];
int cnt=0;
//文件目的路径 基础路径+文件名
String base="C:\\a\\server\\";
String path=base+fileName;
//文件输出流
FileOutputStream fio = new FileOutputStream(path);
//循环读取数据
while ((fileSize)>0) {
//读有多少字节
cnt=is.read(buff);
// String msg=new String(buff,0,cnt);
// //写
// fio.write(msg.getBytes());
fio.write(buff,0,cnt);
}
fileSize-=cnt;
System.out.println("服务器已经接收完成!");
}
}
package com.gongsi.cn.test1;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
//客户端把文件从源路径发送给服务器
//需要先收到一个确认信息返回
public class Client {
public static void main(String[] args) throws Exception {
// 1.创建连接
Socket socket = new Socket("localhost", 9999);
// 2.创建输入输出流
InputStream is = socket.getInputStream();
OutputStream os = socket.getOutputStream();
// 3.创建文件输入流,获取文件名和文件大小
Scanner scanner = new Scanner(System.in);
System.out.println("请输入文件名:");
String fileName = scanner.next();
String base = "C:\\a\\client\\";
String path = base + fileName;
FileInputStream fis = new FileInputStream(path);
int fileSize = fis.available();
// 3.通过输出流把文件名文件大小发送出去
os.write((fileName + "," + fileSize).getBytes());
// 如果接受到信息“Ok”,则将文件传送过去
byte[] buff = new byte[1024];
int cnt = 0;
cnt = is.read(buff);
String msg;
if (cnt > 0) {
msg = new String(buff, 0, cnt);
if ("OK".equals(msg)) {
sendFile(fis, os);
System.out.println("文件发送成功!");
} else {
System.out.println("文件发送失败!");
}
}
System.out.println("按任意键退出程序..");
scanner.next();
socket.close();
}
// 发送文件
private static void sendFile(FileInputStream fis, OutputStream os) throws Exception {
// 接受文件的信息
byte[] buff = new byte[1024];
int cnt = 0;
// 循环读写
while (fis.available() > 0) {
cnt = fis.read(buff);// 读取缓冲区的字节
os.write(buff, 0, cnt);
}
System.out.println("发送文件完成");
}
}