socket传输文件完成后,文件打不开,小文件可以,但似乎分块传输就不行,是初步怀疑黏包问题?希望排查修正一下
clent:
public class Client {
public static void main(String[] args) {
File file=new File("D:\\data.mp4");
try (
Socket socket = new Socket("127.0.0.1", 12345);
FileInputStream fileInputStream=new FileInputStream(file);
ObjectOutputStream objectOutputStream=new ObjectOutputStream(socket.getOutputStream());
) {
byte[] buffer = new byte[1024000];
int blockSize = 1024000; // 块大小
//向上取整
int totalBlocks = (int) Math.ceil((double) file.length() / blockSize);
long bytesRead,chunkNumber=1;
while((bytesRead=fileInputStream.read(buffer))!=-1){
FileInfo fileInfo=new FileInfo(file.getName(),totalBlocks, Math.toIntExact(chunkNumber),bytesRead,buffer);
objectOutputStream.writeObject(fileInfo);
objectOutputStream.flush();
chunkNumber++;
}
// //往服务器写出结束标记
// socket.shutdownOutput();
System.out.println("传输完成!");
} catch (IOException e) {
e.printStackTrace();
}
}
}
FileInfo :
@Data
public class FileInfo implements Serializable {
private String fileName;
private int totalBlocks;//分块总数
private Integer chunkNumber;//当前分块序号
private long currentChunkSize;//当前分块大小
private byte[] data;
public FileInfo(String fileName, int totalBlocks, Integer chunkNumber, Long currentChunkSize, byte[] data) {
this.fileName = fileName;
this.totalBlocks = totalBlocks;
this.chunkNumber = chunkNumber;
this.currentChunkSize = currentChunkSize;
this.data = data;
}
}
Server :
public class Server {
public static void main(String[] args) {
try (ServerSocket serverSocket = new ServerSocket(12345)) {
while (true){
Socket socket = serverSocket.accept();
ServerThread serverThread=new ServerThread(socket);
Thread thread=new Thread(serverThread);
thread.start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
ServerThread :
public class ServerThread implements Runnable{
private Socket socket;
public ServerThread(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try (
ObjectInputStream objectInputStream=new ObjectInputStream(socket.getInputStream());
) {
while (true){
FileInfo fileInfo=(FileInfo)objectInputStream.readObject();
String fileName = fileInfo.getFileName();
long fileSize = fileInfo.getCurrentChunkSize();
System.out.println("正在接收文件: " + fileName + " (" + fileSize + " bytes)");
FileOutputStream fos = new FileOutputStream(fileName,true);
fos.write(fileInfo.getData(),0,(int) fileInfo.getCurrentChunkSize());
fos.flush();
fos.close(); // 关闭 FileOutputStream 对象
if(fileInfo.getChunkNumber()==fileInfo.getTotalBlocks()){
System.out.println("文件传输完成!");
break;
}
}
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}