2013-09-29 52 views
0

我制作了一个应该让客户端读取文件的服务器。总而言之,它正在工作,但有些字节,例如HEX 9D正在转向HEX 3F。我没有更多的想法,也没有在网上找到任何东西。我的服务器代码:Java:字节传输不正确

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(); 
    } 
} 
} 
+3

以“Writer”结尾的类是用于字符的。不适用于字节。 – SpiderPig

回答

2

你不指定适当的编码传输(你应该使用InputStream/OutputStreams,而不是为这个反正Reader/Writer,因为你正在处理二进制数据而不是文本)。 0x3F是问号'?',表示非ASCII字符(128或更高)已被转换。

因此,失去读者和作家,并与流。

+0

好吧,我用'FileInputStream'和'FileWriter'用'FileOutputStream'替换了'FileReader',但它仍然不起作用。还有很多问题标记! (3f) – Ercksen

+0

然后它听起来就是你还在将字节转换为字符的地方。你更新的代码是什么? – Kayaman

+0

好吧,它太长的评论,我不能仍然激起我自己的问题:/所以这里是:http://www.mediafire.com/view/q7ui91o2n30noju/Code.txt – Ercksen

1

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

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

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

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

我该怎么做?我对此很新,对这些问题感到抱歉... – Ercksen