2011-04-09 58 views
0

我從一個套接字客戶端寫入的字節數組爲:如何確保我的服務器讀取客戶端寫入的內容?

byte[] arr = { 49, 49, 49, 49, 49}; 

InetAddress address = InetAddress.getByName(host); 
connection = new Socket(address, port); 
out = new ObjectOutputStream(connection.getOutputStream()); 
out.flush(); 

在接收端,在服務器上,我有:

byte[] msgType = new byte[5]; 
in = new BufferedInputStream(connection.getInputStream()); 
int bytesRead = in.read(msgType, 0, 5); 

System.out.println("msg rcvd: " + msgType.toString()); 

在輸出我得到奇怪的字符串:

server: waiting for connection 
server: connection received from localhost 
server: Connection Successful 
bytes read: 5 
msg rcvd: ��w 

如何確保獲得與我客戶端發送的字節相同的字節?

回答

0

如果您在一側使用ObjectOutputStream,則必須在另一側使用ObjectInputStream

在你的情況,一個簡單的OutputStream(可能緩衝)和.write().read()會做。

但是對於打印,請勿使用byte[].toString(),如果要使用Arrays.toString()格式化輸出。


編輯:我只是看到你甚至沒有在發送端寫你的數組。所以你實際上只是讀ObjectOutputStream頭。


從評論:

我處理服務器端,有人告訴我,我會發送一個字節數組。 如何接收並打印該字節數組?在這種情況下字節數組是文本的字節/串

這聽起來像服務器發送像簡單地在一些編碼編碼的字符串,如ASCII,UTF-8或ISO-8859-1。如果是這樣,在接收端就可以使用這樣的事情:

String encoding = "UTF-8"; 
BufferedReader in = 
    new BufferedReader(new InputStreamReader(connection.getInputStream(), 
              encoding)); 
String line; 
while((line = in.readLine()) != null) { 
    System.out.println(line); 
} 

當然,確保編碼爲實際的發送端使用相同的編碼。

對應的發送代碼可能是這樣的:

String encoding = "UTF-8"; 
Writer w = 
    new BufferedWriter(new OutputStreamWriter(connection.getOutputStream(), 
               encoding)); 
w.write("Hello World!\n"); 
w.write("And another line.\n"); 
w.flush(); 
+0

同意了,如果使用ObjectOutputStream或ObjectInputStream,則必須同時使用兩者。在這種情況下,你既不需要。 – MeBigFatGuy 2011-04-09 02:24:26

+0

@meBigFatGuy - 我如何確保客戶端使用與服務器端相同的流。我正在處理服務器端,我被告知我將發送一個字節數組。我如何接收和打印該字節數組?在這種情況下,字節數組是文本/字符串的字節。 – user656189 2011-04-11 17:54:39

+0

@ user656189:看看我最近編輯的例子。 – 2011-04-11 19:23:10

1

我不確定究竟是什麼打印出來的,但我可以告訴你msgType.toString()不會打印字節數組的內容。

Here是我發現的一個鏈接,它將以更有意義的方式打印出字節數組。

1

你得到相同的字節,它只是一個你如何解釋這些問題。如果你想看到的字節爲String用這個代替:

System.out.println("msg rcvd: " + new String(msgType, "UTF-8")); 

要小心,你正在處理的字節具有正確的編碼,但(我認爲UTF-8在這裏)。因爲你已經是ObjectOutputStream,你可以在服務器端使用它的writeUTF(),在客戶端使用ObjectInputStream.readUTF()

相關問題