【发布时间】:2013-11-16 23:08:27
【问题描述】:
所以我正在构建一个需要内置自动更新功能的程序,因为我已经完成并对其进行了测试,似乎当我通过套接字发送 jar 文件并将其写入新制作的 jar 时文件丢失 5KB(每次......即使大小发生变化)大小并损坏。
这是我的代码:
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();}
}
}
这个类将等待来自客户端的连接,然后在连接后立即将更新推送给它们。 File 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();
}
感谢任何帮助。谢谢!
【问题讨论】:
-
在几乎所有语言中,在所有平台上,您都需要在 .Close 之前调用 .Flush 方法,以确保将最后的剩余部分推送(到磁盘或网络)。出于某种原因,.Close 从不调用 .Flush。
-
@MDR 不真实。请参阅 FilterOutputStream.close() 的合同。在任何设计良好的类库中,close 应该确保刷新。
标签: java sockets jar inputstream outputstream