/**
* 需求:将指定文件从D盘目录d:\1下移动到d:\2下
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
//1. 建立输入流和输出流
FileInputStream fis = new FileInputStream("d:\\1\\1.png"); //源为d盘1目录下文件1.png
FileOutputStream fos = new FileOutputStream("d:\\2\\2.png"); //目的为d盘2目录下文件2.png
//2. 使用自定义缓冲区将输入流和输出流关联起来
byte[] buf = new byte[1024]; // 定义1024byte的缓冲区
int len = 0; // 输入流读到缓冲区中的长度
//3. 将数据从输入流循环读入缓冲区, 当读到文件最后,会得到值-1
while((len=fis.read(buf))!=-1){
fos.write(buf,0,len); //将读到长度部分写入输出流
}
//4. 关闭流
fis.close();
fos.close();
}
- 客户端发数据到服务端
/*
* TCP传输,客户端建立的过程
* 1,创建TCP客户端Socket服务,使用的是Socket对象。
* 建议该对象一创建就明确目的地。要连接的主机。
* 2,如果连接建立成功,说明数据传输通道已建立。
* 该通道就是Socket流,是底层建立好的。既然是流,说明这里既有输入,又有输出。
* 3,使用输出流,将数据写出。
* 4,关闭资源。
*/
// 建立客户端Socket
Socket s = new Socket(InetAddress.getLocalHost(), 9003);
// 获得输出流
OutputStream out = s.getOutputStream();
// 获得输入流
FileInputStream fis = new FileInputStream("d:\\1\\1.png");
// 发送文件信息
byte[] buf = new byte[1024];
int len = 0;
while ((len = fis.read(buf)) != -1) {
// 写入到Socket输出流
out.write(buf, 0, len);
}
s.shutdownOutput();
// 关流
out.close();
fis.close();
s.close();
- 服务端
ServerSocket ss = new ServerSocket(9003);// 需要指定端口,客户端与服务端相同,一般在1000-65535之间
//服务端一般一直开启来接收客户端的信息。
while (true) {
// 获取客户端Socket
Socket s = ss.accept();
// 获取输入流与输出流
InputStream in = s.getInputStream();// 输入流
FileOutputStream fos = new FileOutputStream("d:\\3\\3.png");
// 创建缓冲区关联输入流与输出流
byte[] buf = new byte[1024];
int len = 0;
// 数据的写入
while ((len = in.read(buf)) != -1) {
fos.write(buf, 0, len);
}
// 关流
fos.close();
s.close();
}
完整代码:
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
public class Client {
public static void main(String[] args) throws UnknownHostException, IOException {
/*
* 客户端先向服务端发送一个文件名,服务端接收到后给客户端一个反馈,然后客户端开始发送文件
*/
//建立客户端Socket
Socket s = new Socket(InetAddress.getLocalHost(), 9001);//修改为服务器IP地址
//获得输出流
OutputStream out = s.getOutputStream();
//关联发送文件
File file = new File("D:\\1.png");
String name = file.getName();//获取文件完整名称
String[] fileName = name.split("\\.");//将文件名按照.来分割,因为.是正则表达式中的特殊字符,因此需要转义
String fileLast = fileName[fileName.length-1];//后缀名
//写入信息到输出流
out.write(name.getBytes());
//读取服务端的反馈信息
InputStream in = s.getInputStream();
byte[] names = new byte[50];
int len = in.read(names);
String nameIn = new String(names, 0, len);
if(!fileLast.equals(nameIn)){
//结束输出,并结束当前线程
s.close();
System.exit(1);
}
//如果正确,则发送文件信息
//读取文件信息
FileInputStream fr = new FileInputStream(file);
//发送文件信息
byte[] buf = new byte[1024];
while((len=fr.read(buf))!=-1){
//写入到Socket输出流
out.write(buf,0,len);
}
//关流
out.close();
fr.close();
s.close();
}
}
- 服务端 任务类
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class Task implements Runnable {
private Socket s;
public Task(Socket s){
this.s = s;
}
@Override
public void run() {
String ip = s.getInetAddress().getHostAddress();
try{
//获取客户端输入流
InputStream in = s.getInputStream();
//读取信息
byte[] names = new byte[100];
int len = in.read(names);
String fileName = new String(names, 0, len);
String[] fileNames = fileName.split("\\.");
String fileLast = fileNames[fileNames.length-1];
//然后将后缀名发给客户端
OutputStream out = s.getOutputStream();
out.write(fileLast.getBytes());
//新建文件
File dir = new File("d:\\server\\"+ip);
if(!dir.exists())
dir.mkdirs();
File file = new File(dir,fileNames[0]+"."+fileLast);
FileOutputStream fos = new FileOutputStream(file);
//将Socket输入流中的信息读入到文件
byte[] bufIn = new byte[1024];
while((len = in.read(bufIn))!=-1){
//写入文件
fos.write(bufIn, 0, len);
}
fos.close();
s.close();
}catch(Exception e){
e.printStackTrace();
}
}
}
- 服务器类
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) throws IOException {
/*
* 服务端先接收客户端传过来的信息,然后向客户端发送接收成功,新建文件,接收客户端信息
*/
//建立服务端
ServerSocket ss = new ServerSocket(9001);//客户端端口需要与服务端一致
while(true){
//获取客户端Socket
Socket s = ss.accept();
new Thread(new Task(s)).start();
}
}
}
版权声明:本文为ximaiyao1984原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。