簡體   English   中英

如果文件被分段發送,則jar文件在通過套接字發送后會損壞

[英]jar File Becomes Corrupted After Being Sent Over Socket IF It Was Sent In Pieces

我已經嘗試解決這個問題了幾個小時,但似乎無濟於事。 這是我的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;

公共類數據實現了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();
    }

您遇到通常的問題。 您將忽略read()方法的結果。 在兩端嘗試此操作:

while ((count = in.read(buffer)) > 0)
{
    out.write(buffer, 0, count);
}

完全不需要對象流。 這適用於任何大於0的大小緩沖區。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM