jar文件在通过套接字发送后被损坏如果它是以件发送的

时间:2013-07-16 19:19:24

标签: java sockets networking

我一直试图解决这个问题几个小时,但似乎没有任何帮助。这是我的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;

import java.io.Serializable;

public class Data实现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();
    }

1 个答案:

答案 0 :(得分:0)

你有通常的问题。您忽略了read()方法的结果。在两端试试这个:

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

根本不需要对象流。这适用于任何大小的缓冲区&gt; 0