100分,socket传输文件,跪求大神告诉我,我的代码错在哪里
问题:我现在要传输文件夹下的所有文件,代码如下,问题是我在client端接受到的数据只有最后一个文件是正确的,其他的都少了几KB或多了几KB,传输的文件大小从5M到300M不等,我找了2天错误都不知道我哪些错了,求大神指点...
server代码:
import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class MyServer {
static String filePath = "D://DatabaseBackup";
static String getClientMsg(InputStream clientIn) {
byte[] buffer = new byte[77];
int length = 0;
try {
length = clientIn.read(buffer, 0, buffer.length);
} catch (IOException e) {
e.printStackTrace();
}
return new String(buffer, 0, length);
}
static File[] getBackupDatabases() {
File file = new File(filePath);
File[] files = null;
if (file.exists() && file.isDirectory() && file != null) {
files = file.listFiles();
}
return files;
}
static void getDataOutputStream(Socket socket, File[] files) {
try {
DataOutputStream serverOut = new DataOutputStream(
socket.getOutputStream());
DataInputStream fileIn = null;
serverOut.writeInt(files.length);
serverOut.flush();
for (int i = 0; i < files.length; i++) {
fileIn = new DataInputStream(new BufferedInputStream(
new FileInputStream(filePath + "//"
+ files[i].getName())));
serverOut.writeLong(files[i].length());
System.out.println("file [" + i + "] length is : "
+ files[i].length());
serverOut.flush();
serverOut.writeUTF(files[i].getName());
serverOut.flush();
byte[] buffer = new byte[1024];
int length = 0;
while ((length = fileIn.read(buffer, 0, buffer.length)) != (-1)) {
serverOut.write(buffer, 0, length);
}
serverOut.flush();
try {
Thread.sleep(0);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
fileIn.close();
serverOut.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
ServerSocket server = null;
Socket socket = null;
try {
server = new ServerSocket(7777);
System.out.println("waiting for client request...");
socket = server.accept();
if (socket.isConnected()) {
InputStream clientIn = socket.getInputStream();
String clientMsg = getClientMsg(clientIn);
if ("this is from client...[client]".equals(clientMsg)) {// 可信的客户端
System.out.println("the client request is coming...");
// 得到备份数据
File[] files = getBackupDatabases();
if (files.length > 0) {
getDataOutputStream(socket, files);
}
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
socket.close();
server.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
-----------------------------------------------
client代码:
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
public class MyClient {
static String fileOut = "F://DatabaseBackup//";
public static void main(String[] args) {
Socket socket = null;
try {
socket = new Socket("192.168.1.102", 7777);
OutputStream outToServer = socket.getOutputStream();
outToServer.write("this is from client...[client]".getBytes());// 发送给服务端的验证字符串
DataInputStream serverIn = new DataInputStream(
new BufferedInputStream(socket.getInputStream()));
DataOutputStream fileOut = null;
int fileLength = serverIn.readInt();
System.out.println("the files size is : " + fileLength);
for (int i = 0; i < fileLength; i++) {
byte[] buffer = new byte[1024];
long fileSize = serverIn.readLong();
System.out.println("file [" + i + "] length is : " + fileSize);
String fileName = serverIn.readUTF();
System.out.println("file name is : " + fileName);
try {
Thread.sleep(0);
} catch (InterruptedException e) {
e.printStackTrace();
}
fileOut = new DataOutputStream(new BufferedOutputStream(
new FileOutputStream(MyClient.fileOut + fileName)));
long hasRead = 0;
long reset = 0;
int readLength = buffer.length;
boolean flag = false;
while (true) {
int read = 0;
read = serverIn.read(buffer, 0, readLength);
hasRead = hasRead + read;
reset = fileSize - hasRead;
fileOut.write(buffer, 0, read);
if (flag) {
break;
}
if (reset <= 512) {
System.out.println("hasRead is : " + hasRead);
System.out.println("reset is : " + reset);
readLength = (int) reset;
flag = true;
}
}
System.out.println("file [" + i + "] download over ");
System.out
.println("------------------------------------------");
}
fileOut.close();
serverIn.close();
outToServer.close();
serverIn.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
socket
[解决办法]
客户端可疑代码:
if (flag) {
break;
}
if (reset <= 512) {
System.out.println("hasRead is : " + hasRead);
System.out.println("reset is : " + reset);
readLength = (int) reset;
flag = true;
}