Java IO => BIO实现任意类型文件上传
客户端
目标:实现客户端上传任意类型的文件数据给服务端保存起来。
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;
/**
* 客户端
*/
public class Client {
public static void main(String[] args) {
try {
// 1、请求与服务端的Socket链接
Socket socket = new Socket("127.0.0.1",8888);
// 2、把字节输出流包装成一个数据输出流
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
// 3、先发送上传文件的后缀给服务端,可以是任意文件类型
dos.writeUTF(".png");
// 4、把文件数据发送给服务端进行接收
InputStream is = new FileInputStream("/Users/pengswn/Desktop");
byte[] buffer = new byte[1024];
int len;
while ((len = is.read(buffer)) > 0){
dos.write(buffer,0,len);
}
dos.flush();
// 通知服务端这边的数据发送完毕了
socket.shutdownOutput();
} catch (IOException e) {
e.printStackTrace();
}
}
}
服务端
目标:服务端开发,可以实现接收客户端的任意类型文件,并保存到服务端磁盘。
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
/**
* 服务端
*/
public class Server {
public static void main(String[] args) {
try {
ServerSocket ss = new ServerSocket(8888);
while (true){
Socket socket = ss.accept();
//交给一个独立的线程来处理与这个客户端的文件通信需求。
new ServerReaderThread(socket).start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
服务端读取链接线程类
import java.io.DataInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.util.UUID;
public class ServerReaderThread extends Thread{
private Socket socket;
public ServerReaderThread(Socket socket){
this.socket = socket;
}
@Override
public void run() {
DataInputStream dis = null;
try {
// 1、得到一个数据输入流读取客户端发送过来的数据
dis = new DataInputStream(socket.getInputStream());
// 2、读取客户端发送过来的文件类型
String suffix = dis.readUTF();
System.out.println("服务端已经成功接收到了文件类型:" + suffix);
// 3、定义一个字节输出管道负责把客户端发来的文件数据写出去
OutputStream os = new FileOutputStream("/Users/pengswn/Desktop"+ UUID.randomUUID().toString()+suffix);
// 4、从数据输入流中读取文件数据,写出到字节输出流中去
byte[] buffer = new byte[1024];
int len;
while ((len = dis.read(buffer)) > 0){
os.write(buffer,0,len);
}
os.close();
System.out.println("服务端接收文件保存成功");
} catch (IOException e) {
e.printStackTrace();
}
}
}