1.案例需求
使用字节流从客户端发送视频文件到服务端,服务端通知客户端文件上传完毕
2.编程思路
- 客户端
- 打开视频文件:使用FileInputStream打开要发送的视频文件。
- 建立网络连接:创建一个Socket对象,连接到服务端的指定IP地址和端口。
- 发送文件数据:将FileInputStream包装在BufferedInputStream中以提高效率。
- 读取视频文件的内容,并通过Socket的getOutputStream()方法写入到网络流中。可以使用一个循环来持续读取文件内容,直到文件末尾(即read()方法返回-1)。
- 等待服务端响应:发送完文件后,客户端可以通过Socket的getInputStream()读取服务端的响应,确认文件是否接收成功。
- 关闭资源:关闭FileInputStream、BufferedInputStream和Socket,释放资源。
- 服务端
- 监听网络连接:使用ServerSocket在指定端口上监听客户端的连接请求。
- 接受客户端连接:当客户端连接时,ServerSocket的accept()方法会返回一个Socket对象,用于与客户端通信。
- 接收文件数据:通过Socket的getInputStream()获取输入流,并将其包装在BufferedInputStream中以提高读取效率。创建一个FileOutputStream用于将接收到的数据写入到本地文件系统中。读取输入流中的数据,并写入到FileOutputStream中,直到输入流结束。
- 文件接收完毕处理:当文件接收完毕后,可以执行一些后处理操作,如校验文件完整性等。
- 通知客户端:通过Socket的getOutputStream()发送一个确认消息给客户端,表明文件已成功接收。这个消息可以是一个简单的字符串,如"服务端文件接收成功"。
- 关闭资源:关闭Socket、FileInputStream(如果有的话,实际上在服务端这里应该是FileOutputStream)、和任何其他打开的流资源。
3.案例源码
服务端源码:
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class Serve {
public static void main(String[] args) throws IOException {
ServerSocket serve = new ServerSocket(7835);
System.out.println("服务器已开启,等待连接...");
Socket client = serve.accept()