0

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;

}
4

1 に答える 1

2

@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();
于 2013-09-28T11:19:10.950 に答える