2013-07-16 1 views
0

지금 몇 시간 동안이 문제를 해결하려고 노력했지만 아무것도 도움이되지 않습니다. 이것은 내 FOV에서 문제입니다.jar 파일이 소켓을 통해 전송 된 후 손상된 경우

기본적으로 내가하려는 것은 소켓을 통해 jar 파일을 보내는 것입니다. 내가 ServerSocket을 설정하고 연결을 기다렸다가 연결합니다. 연결 후 ObjectStream을 설정합니다. 그런 다음 클라이언트 측에서 다운로드를 요청합니다. 서버는 해당 메시지를 수신하고 그에 따라 반응합니다. 소켓을 통해 클라이언트로 파일을 보내는 스레드를 시작합니다. FileInputStream을 사용하여 파일을 열고 바이트 단위의 파일 길이를 사용합니다. 그런 다음 파일을 X 바이트 조각으로 보냅니다. 나는 여기에 많은 가치를 시도했다. 소켓을 통해 성공적으로 jar 파일을 보내는 유일한 시간은 모든 바이트를 한 번에 보낼 때입니다. 바이트를 두 번 보내면 (첫 번째 절반 반, 두 번째 절반), 전송 된 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) 

그래서 내 질문이 있습니다 : 소켓을 통해 전송 오브젝트가 어떤 방법 또는 어떤 수정합니까이? 내 보낸 파일의 모든 항목이 있기 때문에 제대로 실행되지 않거나 손상된 것 같습니다. + 나는 움직임이 없어졌습니다. 코드를보고 싶다면 보여줄 수 있습니다.

확인. 조각으로 분해하기위한 코드.

obj = in.readObject(); 
if(obj instanceof Data) { 
    Data dat = (Data)obj; 
    fileWriter.write(dat.buffer); 
} 

데이터 클래스 : 다시 파일 붙이기

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; 
     } 
    } 

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(); 
    } 
+1

조각을 함께 모으기위한 코드는 무엇입니까? 조각을 조립하는 방식에 오류가 있거나 조각을 보내는 방식에 오류가 있다고 생각합니다. –

+1

더 빨리 도움을 받으려면 문제를 나타내는 [SSCCE] (http://www.sscce.org)로 코드를 게시하십시오. 이를 통해 사용자는 문제를 복사/붙여 넣기하고 재현 할 수 있습니다. –

답변

0

일반적인 문제가 있습니다. read() 메서드의 결과를 무시합니다. 양쪽 끝이 시도 : 개체에 대한 필요가 전혀 스트림하지

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

. 어떤 크기 버퍼> 0에서도 작동합니다.

+0

"결과 무시"가 아닙니다. 보낸 파일의 원본 크기가 원본 크기와 정확하게 같습니다. – user2098268

+1

결과를 변수에 저장하지 않고'in.read (buffer)'를 사용합니다. 너는 그것을 무시하고있다. QED. 따라서 읽기가 버퍼를 채우고 있다고 가정합니다. 그렇지 않은 경우에는 파일에 쓰레기를 쓰게됩니다. 당신은 논쟁하는 대신에 항상 그것을 시도 할 수 있습니다. 코드가 정말 완벽하면 게시하지 않을 것입니다. – EJP

관련 문제