2013-09-28 28 views
0

我想通过套接字发送一个jar文件到服务器。 现在一切似乎都正常工作,但在套接字的另一侧,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