2013-09-28 2 views
0

Я пытаюсь отправить файл jar через сокет на сервер. Теперь все работает нормально, но с другой стороны гнезда, банка повреждена. Файлы имеют по обе стороны сокета одинаковые длины. Но когда я пытаюсь использовать файл в bukkit, файл поврежден.Jar-файл поврежден при отправке через сокет

Код клиента:

public class Main { 
private Socket connection; 
private ObjectOutputStream outStream; 
private static String serverAddress = ""; // the ip address 
static File fileLoc = new File("C:\\Users\\Tom\\Documents\\Qubeproject\\server\\plugins"); 
static String fileName = "\\WorldEdit.jar"; 
static File file ; 
static InputStream IS; 
static OutputStream OS; 
static byte[] msgByte = new byte[1024]; 


public static void main(String[] arg0){ 
    p("Starting this shit up"); 
    file = new File(fileLoc + fileName) ; 

    try { 
     Socket connection = connection(); 
     IS = connection.getInputStream(); 
     OS = connection.getOutputStream(); 

     OS.write(msg("LOL")); 
     //Authenciation 


     IS.read(msgByte); 
     if(new String(msgByte).trim().equals("OK")){ 
      p("OK"); 



      OS.write(msg(fileName)); 
      //sending fileName 


      IS.read(msgByte); 
      p(new String(msgByte).trim()); 
      //confirmation 



      OS.write(msg("l:" + (file.length()))); 



      byte[] fileByte = new byte[(int)(file.length())]; 

      FileInputStream jis = new FileInputStream(file); 
      int count = 0; 
      while((count = jis.read(fileByte))>0){ 

      OS.write(fileByte,0,count); 
      OS.flush(); 
      } 

      OS.flush(); 

      setByteZero(msgByte); 

      IS.read(msgByte); 
      p(new String(msgByte).trim()); 
      //confirmation 

     }else{ 
      p("Authenciation failed"); 
     } 







    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

} 
    private static void p (String s){ 
    System.out.println(s); 
} 
    private static byte[] msg(String s){ 
     return s.getBytes(); 
    } 

    private static Socket connection() throws IOException{ 
     Socket socket = new Socket(); 
     InetAddress ip = InetAddress.getByName(serverAddress); 
     InetSocketAddress address = new InetSocketAddress(ip,6969); 
     socket.connect(address,6969); 
     return socket; 
    } 

    private static byte[] setByteZero(byte[] workByte) { 
     for(int i=0;i < workByte.length;i++){ 
      workByte[i] = 0; 
     } 
     return workByte; 

    } 

код сервера в Bukkit

public class Checkup implements Runnable{ 
Server serverB; 
ServerSocket server; 
Socket client; 
InputStream IS; 
OutputStream OS; 
static File destination; 
byte[] msgByte = new byte[1024]; 
String filename; 
long length; 



Checkup (Server serverm){ 
    serverB = serverm; 
} 




@Override 
public void run() { 

    try{ 
     server = new ServerSocket(6969); 
    }catch(Exception e){ 
    } 
    try{ 
    while(true){ 
      client = server.accept(); 


      IS = client.getInputStream(); 
      OS = client.getOutputStream(); 

      IS.read(msgByte); 


      if(msg(msgByte).equals("LOL")){ 
       OS.write(msg("OK")); 

       IS.read(msgByte); 

       filename = msg(msgByte); 


       OS.write(msg("Q received name :" + filename)); 

       OS.flush(); 

       setByteZero(msgByte); 

       IS.read(msgByte); 

       length = Integer.parseInt(new String(msgByte).trim().replace("l:", "")); 


       OS.write(msg("Q received length :" + length)); 

       byte[] fileByte = new byte[(int)length]; 


       destination = new File("C:\\Users\\Quentin\\Desktop\\DE server\\plugins" + filename); 

       FileOutputStream fos = new FileOutputStream(destination); 

       int count = 0; 



       while((count =IS.read(fileByte))>0){ 



       fos.write(fileByte); 
       fos.flush(); 

       } 
       fos.flush(); 
       fos.close(); 

       OS.write(msg("Q received the jar!Bye")); 
       client.close(); 



      } 






    }  

    }catch (Exception e){ 
     e.printStackTrace(); 
     try { 
      serverB.reload(); 
     } catch (Exception e1) { 
      // TODO Auto-generated catch block 
      e1.printStackTrace(); 
     } 
    } 

finally{ 

    }} 




private String msg(byte[] strByte){ 
    return new String(strByte).trim(); 
} 

private static byte[] msg(String s){ 
    return s.getBytes(); 
} 


private static byte[] setByteZero(byte[] workByte) { 
    for(int i=0;i < workByte.length;i++){ 
     workByte[i] = 0; 
    } 
    return workByte; 

} 
+6

Вы игнорируя возвращаемое значение 'InputStream.read' везде. Не делай этого. –

+0

Имеет ли это какое-либо отношение к поврежденному файлу? Потому что с fileByte я думаю, что я не игнорирую возвращаемое значение, так как я использую count = IS.read (fileByte). – tb96

+3

Посмотрите на * каждый вызов * на 'IS.read (msgByte)', который игнорирует результат. Независимо от того, является ли это проблемой, которую вы сейчас рассматриваете, это проблема * большой * в целом. Кроме того, вы должны действительно проверить, какие отличия в файле - сначала взять хэш MD5 или другую контрольную сумму отправляемого и полученного файла. Может быть, проблема совершенно иная. Существуют различные другие проблемы с этим кодом, если честно, но стоит порекомендовать их по одному ... –

ответ

2

указал вам @ Джон проблемы, здесь прописана и отформатирован .....

Следующий код наполовину игнорирует счетчик (и счетчик также является законным 0):

  while((count =IS.read(fileByte))>0){ 
      fos.write(fileByte); 
      fos.flush(); 
      } 
      fos.flush(); 
      fos.close(); 

и должно быть написано как:

  while((count =IS.read(fileByte))>=0){ 
      fos.write(fileByte, 0, count); 
      } 
      fos.flush(); 
      fos.close(); 
+0

Спасибо, ваше решение сделало это для меня! – tb96

Смежные вопросы