2013-09-29 48 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