Java:字节传输不正确

时间:2013-09-29 16:43:13

标签: java java-io

我已经制作了一台服务器,应该让客户端使用udpate文件。总而言之,它正在工作,但有些字节,例如HEX 9D正在进入HEX 3F。我没有更多的想法,也没有在网上找到任何东西。我的服务器代码:

package de;

import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.net.Socket;

public class UpdateThread extends Thread {
public UpdateThread(Socket s) {
    socket = s;
}

public void run() {
    try {
        execute();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

@SuppressWarnings("resource")
public void execute() throws IOException {
    if (UpdateProvider.update) {
        int i = 0;
        SocketTools.sendData(1, socket);
        File file = new File("." + System.getProperty("file.separator").toString()     + "update_package.jar");
        OutputStreamWriter writer = new   OutputStreamWriter(socket.getOutputStream());
        FileReader reader = new FileReader(file);
        while ((i = reader.read()) != -1) {
            writer.write(i);
        }

        writer.flush();
        writer.close();

    } else {
        SocketTools.sendData(0, socket);
    }
}

private Socket socket;

}

我的客户代码:

package de;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;

public class Main {
@SuppressWarnings("resource")
public static void main(String[] args) throws IOException {
    Socket s = new Socket("localhost", 16642);
    BufferedReader reader = new BufferedReader(new InputStreamReader(s.getInputStream()));
    //InputStreamReader reader = new InputStreamReader(s.getInputStream());
    int i = 0;
    FileWriter writer = new FileWriter(new File("C:\\update_package.jar"));

    int state = reader.read();

    if (state == 48) {
        System.exit(0);
    }

    if (state == 49) {
        while ((i = reader.read()) != -1) {
            System.out.println(i);
            writer.write(i);
        }
        System.out.println("ENDE");
        writer.flush();
    }
}
}

2 个答案:

答案 0 :(得分:2)

您没有为传输指定正确的编码(无论如何,您应该使用InputStream / OutputStreams代替Reader / Writer,因为您和#39;重新处理二进制数据而不是文本)。 0x3F是问号'?',表示已转换非ASCII字符(128或更高)。

所以失去读者和作家,然后选择Streams。

答案 1 :(得分:1)

仅对文本文件进行编码。我查看了你的源代码。您正在转移jar,这是一个二进制文件,而不是文本。如果使用二进制数据使用文本处理类,则可能会发生许多不可预测的转换。不要使用OutputStreamWriter。直接使用socket.getOutputStream():

OutputStream = socket.getOutputStream();
...
out.write(...);

客户相同。不要使用InputStreamReader。直接使用s.getInputStream():

InputStream in = s.getInputStream();
...
in.read(...);