基于 BIO 形式下的文件上传
客户端
实现客户端上传任意类型的文件数据给服务端保存起来
- 与服务端建立连接
- 将文件包装成输入流
- 将字节输出流包装成数据输出流
- 将文件后缀写入数据输出流
- 通知服务端连接终止,否则服务端还会一直等待接收,并抛出异常
public class Client {
public static void main(String[] args) {
try {
//与服务端建立连接
Socket socket = new Socket("127.0.0.1",9999);
//将文件包装成输入流
InputStream is = new FileInputStream("C:\\Users\\Administrator\\Desktop\\pic\\007.jpg");
//将字节输出流包装成数据输出流
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
//将文件后缀写入数据输出流
dos.writeUTF(".jpg");
byte[] buffer = new byte[1024];
int len;
while ((len = is.read(buffer)) > 0){
dos.write(buffer);
}
dos.flush();
//通知服务端连接终止,否则服务端还会一直等待接收,
socket.shutdownOutput();
} catch (IOException e) {
e.printStackTrace();
}
}
}
服务端
可以实现接收客户端的任意类型文件,并保存到服务器端磁盘
- 注册端口号
- 监听访问端口的线程
- 创建线程
public class Service {
public static void main(String[] args) {
try {
ServerSocket ss = new ServerSocket(9999);
while (true){
Socket socket = ss.accept();
new ServiceReaderThread(socket).start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
Socket线程处理类
- 将字符输出流包装成数据输出流
- 读取客户端发来的文件后缀名
- 创建字节输出流接收客户端发送来的数据
public class ServiceReaderThread extends Thread{
private Socket socket;
public ServiceReaderThread(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
//将字符输出流包装成数据输出流
DataInputStream dis = new DataInputStream(socket.getInputStream());
//读取客户端发来的文件后缀名
String sufix = dis.readUTF();
System.out.println("服务端成功接收到后缀");
//创建字节输出流接收客户端发送来的数据
OutputStream os = new FileOutputStream("C:\\Users\\Administrator\\Desktop\\pic\\" + UUID.randomUUID().toString() + sufix);
byte[] bf = new byte[1024];
int len;
while ((len = dis.read(bf)) > 0 ){
os.write(bf);
}
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}