Итак, я создаю программу, для которой требуется встроенная функция автоматического обновления, поскольку я был закончен и протестирован, кажется, когда я отправляю файл jar через сокет и записать его в недавно созданный файл jar, он пропускает 5 КБ (каждый раз ... даже когда размер изменяет) размер от него и становится коррумпированным.Jar File поврежден после отправки через сокет
Вот мой код:
package server.update;
import java.io.*;
import java.net.Socket;
public class UpdateThread extends Thread
{
BufferedInputStream input; //not used
BufferedInputStream fileInput;
BufferedOutputStream output;
public UpdateThread(Socket client) throws IOException
{
super("UpdateThread");
output = new BufferedOutputStream(client.getOutputStream());
input = new BufferedInputStream(client.getInputStream());
}
public void run()
{
try
{
File perm = new File(System.getProperty("user.dir")+"/GameClient.jar");
//fileInput = new BufferedInputStream(new FileInputStream(perm));
fileInput = new BufferedInputStream(new FileInputStream(perm));
byte[] buffer = new byte[1024];
int numRead;
while((numRead = fileInput.read(buffer)) != -1)
output.write(buffer, 0, numRead);
fileInput.close();
input.close();
output.close();
this.interrupt();
}
catch(Exception e)
{e.printStackTrace();}
}
}
Это класс, который будет ждать подключения от клиента, а затем нажмите обновления к ним, как только он соединяет. Файл Perm - это файл jar, который я хочу отправить, и по какой-либо причине он либо пропускает последние 5 байтов, либо клиент не читает последние 5 (я не знаю, какой). Вот класс клиента для получения информации здесь:
public void getUpdate(String ip) throws UnknownHostException, IOException
{
System.out.println("Connecting to update socket");
update = new Socket(ip,10004);
BufferedInputStream is = new BufferedInputStream(update.getInputStream());
BufferedOutputStream os = new BufferedOutputStream(update.getOutputStream());
System.out.println("Cleaning GameClient.jar file");
File updated = new File(System.getProperty("user.dir")+"/GameClient.jar");
if(updated.exists())
updated.delete();
updated.createNewFile();
BufferedOutputStream osf = new BufferedOutputStream(new FileOutputStream(updated));
System.out.println("Writing to GameClient.jar");
byte[] buffer = new byte[1024];
int numRead = 0;
while((numRead = is.read(buffer)) != -1)
osf.write(buffer, 0, numRead);
System.out.println("Finished updating...");
is.close();
os.close();
update.close();
osf.close();
}
Любая помощь приветствуется. Благодаря!
Практически во всех языках на всех платформах вам необходимо вызвать метод .Flush до .Close, чтобы обеспечить оставление последних остатков (на диск или в сеть). По какой-то причине .Close никогда не вызывает .Flush. – MDR
Спасибо, что это сработало – 3kings
@MDR Неверно. См. Контракт для FilterOutputStream.close().В любой хорошо разработанной библиотеке классов закрытие должно обеспечивать промывку. – EJP