0

我已经制作了一个应该让客户端更新文件的服务器。总而言之,它正在工作,但是某些字节,例如 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();
    }
}
}
4

2 回答 2

2

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

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

于 2013-09-29T16:46:13.403 回答
1

只有文本文件需要编码。我看了你的源代码。您正在传输一个 jar,它是一个二进制文件,而不是文本。如果您对二进制数据使用使用文本处理类,您可以获得很多不可预知的转换。不要使用 OutputStreamWriter。直接使用 socket.getOutputStream() :

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

对客户也一样。不要使用 InputStreamReader。直接使用 s.getInputStream() :

InputStream in = s.getInputStream();
...
in.read(...);
于 2013-09-29T17:37:35.307 回答