我已经制作了一台服务器,应该让客户端使用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();
}
}
}
答案 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(...);