好吧,所以我一直在研究一个轻量级TCP传输应用程序,它几乎完成了,但是,我有一个问题:每当我尝试发送文件时,它确实会被发送但是当它到达时,它总是一对大于发送文件的字节数.例如,如果我发送一个大的111 093字节的图片,当它被收到时,它的大小为111 616字节.(大523个字节)
我仍然可以打开图像等,但如果我发送和.EXE或.JAR,它会在尝试启动时因为这些额外的字节而给我错误.
这些是我的代码:
发信人:
public static void sendFileToServer(File file) {
try {
byteBuffer = new byte[1024];
//PREPARING FOR TRANSFER
output.writeObject("FILE:"+file.getName()+":" + byteBuffer.length);
output.flush();
Client.lblData.setText("Sending file...");
//TRANSFERRING
BufferedInputStream fis = new BufferedInputStream(new FileInputStream(file));
byte[] buffer = new byte[1024];
while ((fis.read(buffer)) > 0) {
output.write(buffer, 0, buffer.length);
}
output.flush();
fis.close();
//TRANSFERRING
output.writeObject("END");
output.flush();
Client.lblData.setText("File sent!");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {}
Client.lblData.setText("Waiting...");
} catch (IOException e) {
e.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud)
RECIEVER:
if(file) {
try {
message = (String) input.readObject();
if(message.contains("END")) {
Server.conLabel.setText("Connected to: " + socket.getInetAddress().getHostName() + ":" + socket.getPort());
fos.flush();
fos.close();
file = false;
}
} catch (IOException | ClassNotFoundException e) {}
byte[] buffer = new byte[65536];
int number;
while ((number = input.read(buffer)) != -1) {
fos.write(buffer,0,number);
}
} else {
if (message.startsWith("FILE")) {
//PREPARING FOR FILE TRANSFER
file = true;
Server.conLabel.setText("Recieving file...");
for(int i = 0; i < Server.files.getSize(); i++) {
if(Server.files.getElementAt(i).equals(message.split(":")[1])) {
Server.list.setSelectedIndex(i);
if(!new File(Server.dlLoc.getText()).exists()) {
new File(Server.dlLoc.getText()).mkdirs();
}
if(!new File(Server.dlLoc.getText() + "/" + message.split(":")[1]).exists()) {
new File(Server.dlLoc.getText() + "/" + message.split(":")[1]).createNewFile();
}
fos = new FileOutputStream(new File(Server.dlLoc.getText() + "/" + message.split(":")[1]));
}
}
}
Run Code Online (Sandbox Code Playgroud)
}
此外,这是我第一次做过这样的事情,所以请告诉我其他在这些代码中有用的东西.
111,616 = 1024*109
您正在向发送方写入完整的缓冲区,而不是注意最后一个缓冲区很短的事实.改为:
int len;
while ((len = fis.read(buffer)) > 0) {
output.write(buffer, 0, len);
}
Run Code Online (Sandbox Code Playgroud)