簡體   English   中英

通過套接字發送時,Jar文件被破壞

[英]Jar file gets corrupted when sent over socket

我正在嘗試通過套接字將jar文件發送到服務器。 現在一切似乎工作正常,但在套接字的另一端,jar已損壞。 這些文件在套接字的兩側都有相同的長度。 但是當我嘗試在bukkit中使用該文件時,該文件已損壞。

客戶端代碼:

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;

}

@Jon向你指出了這個問題,這里拼出來並格式化.....

以下代碼半忽略計數(並且計數合法也為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();

暫無
暫無

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

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