我已经尝试解决这个问题几个小时了,但似乎没有任何帮助。这是我的FOV中的一个问题。
所以基本上我想做的是通过套接字发送一个 jar 文件。我设置了我的 ServerSocket,等待连接,连接到它。连接后我设置了 ObjectStreams。然后我从客户端发送一个下载请求。服务器接收到该消息并做出相应的反应:启动一个线程,该线程通过套接字将文件发送到客户端。它使用 FileInputStream 打开文件,以字节为单位获取文件的长度。然后它以 X 字节的形式发送文件。我在这里尝试了很多值。我唯一一次通过套接字成功发送 jar 文件是一次发送所有字节。如果我发送字节 2 次(第一次的一半,之后的一半),那么我发送的 jar 文件将不再工作,它会损坏。
它仅因某些值而损坏。对于其他人,当我尝试运行它时,什么也没有发生。所以我在 CMD 中运行,结果我得到了一个错误:
Exception in thread "main" java.util.zip.ZipException: invalid LOC header (bad signature)
at java.util.zip.ZipFile.read(Native Method)
at java.util.zip.ZipFile.access$1400(Unknown Source)
at java.util.zip.ZipFile$ZipFileInputStream.read(Unknown Source)
at java.util.zip.ZipFile$ZipFileInflaterInputStream.fill(Unknown Source)
at java.util.zip.InflaterInputStream.read(Unknown Source)
at org.ninjacave.jarsplice.JarSpliceLauncher.extractNatives(JarSpliceLauncher.java:140)
at org.ninjacave.jarsplice.JarSpliceLauncher.<init>(JarSpliceLauncher.java:63)
at org.ninjacave.jarsplice.JarSpliceLauncher.main(JarSpliceLauncher.java:234)
所以我的问题是:通过套接字发送的对象会以某种方式被修改还是什么?因为我发送的文件中的所有内容都存在,但它似乎无法正常启动或损坏。+ 我的动作用完了。如果你想看代码,我可以展示它。
好的。分解成碎片的代码。
public void run() {
FileInputStream fileStream = null;
try {
fileStream = new FileInputStream(file);
} catch (FileNotFoundException e) {
e.printStackTrace();
return;
}
long length = file.length(), done = 0;
byte[] buffer = new byte[step];
try {
int counter = 0;
while(done + step < length) {
fileStream.read(buffer);
output.writeObject(new Data(buffer, counter));
done+=step;
counter+=1;
}
int last = (int)(length - done);
byte[] lastBuffer = new byte[last];
fileStream.read(lastBuffer);
output.writeObject(new Data(lastBuffer, counter));
output.writeObject(new Message(null, Message.SEND_COMPLETED));
}catch(IOException e) {
e.printStackTrace();
return;
}
try {
fileStream.close();
} catch (IOException e) {
e.printStackTrace();
return;
}
}
将文件粘贴回去:
obj = in.readObject();
if(obj instanceof Data) {
Data dat = (Data)obj;
fileWriter.write(dat.buffer);
}
数据类:
package act;
导入 java.io.Serializable;
公共类数据实现可序列化{
/**
*
*/
private static final long serialVersionUID = 3070641500586981886L;
public byte[] buffer;
public int counter = 0;
public Data(byte[] buffer, int counter) {
this.counter = counter;
this.buffer = buffer;
}
}
这是我为自己制作的某种“示例”程序,看看我的程序是否真的可以在没有网络的情况下工作。它确实如此。
public static void main(String args[]) {
File fileSource = new File("tosend.jar");
File fileDest = new File("C:/Users/Chris/Desktop/downloader/Testing/dest/dest.jar");
try {
FileInputStream in = new FileInputStream(fileSource);
FileOutputStream out = new FileOutputStream(fileDest);
long length = fileSource.length(), done = 0;
int step = 1000;
byte[] buffer = new byte[step];
while(done + step < length) {
in.read(buffer);
out.write(buffer);
done+=step;
}
int last = (int)(length - done);
buffer = new byte[last];
in.read(buffer);
out.write(buffer);
in.close();
out.close();
System.out.println("Writing compleete!");
}catch(IOException e) {
e.printStackTrace();
}