2014-11-05 49 views
-1

我正在創建一個簡單的客戶機 - 服務器應用程序,並在通過Socket傳遞消息時面臨一些奇怪的行爲:當客戶機寫入服務器時,消息正確傳遞,但是當服務器發送對此,取其值通過套接字發送似乎得到複製...通過套接字傳遞字符串重複值

這裏是服務器的操作示例代碼:

. 
. 
. 
public void respond(Socket socket) 
{ 
    try 
    { 
     InputStreamReader inStream = new InputStreamReader(socket.getInputStream()); 
     PrintWriter outStream = new PrintWriter(
       new OutputStreamWriter(socket.getOutputStream(), "UTF-16")); 

     outStream.write("Message received\n"); 
     outStream.flush(); 

     . 
     . 
     . 
    } 
    catch (Exception e) { /* Do something */ } 
} 
. 
. 
. 

服務器和客戶端當前在同一臺機器上運行。此外,從客戶端寫入服務器時編碼似乎不成問題,但是從服務器寫入客戶端時:如果我爲OutputStreamWriter指定任何其他(或不包含)UTF-16編碼,則客戶端將獲得無法正確解析消息。

你們有沒有想法爲什麼這可能是?

+1

我認爲你犯了一個錯誤粘貼你的代碼,taht不編譯(重複變量)。 – Dici 2014-11-05 17:24:23

+0

有可能您的代碼實際上並未被編譯,而是在現有編譯中運行,因爲您有兩次相同的代碼塊,導致重複的變量錯誤。 – Zymus 2014-11-05 17:28:40

+0

Sry,發生粘貼時,我編輯它,仍然是同樣的問題 – pablo 2014-11-05 17:45:01

回答

0

對話兩端的字符編碼需要相同:在客戶端用InputStreamReader編碼的Charset必須與服務器上的OutputStreamWriter使用的編碼匹配(反之亦然)。

如果你沒有指定一個,它將使用JVM的默認值。

當您沒有提供客戶端代碼時,服務器使用默認的Charset進行讀取而使用UTF-16進行寫入的事實使我認爲存在潛在的不匹配。

+0

我運行在同一臺機器上的客戶端和服務器的代碼,所以默認的編碼應該是相同的,我猜? – pablo 2014-11-05 18:41:39

+0

我想你誤解了我(但會澄清我的答案)。你的服務器的'InputStreamReader'(上面)沒有指定一個'Charset',所以它使用了默認的。如果客戶端的'OutputStreamReader'設置爲'UTF-16',那麼將會有一個不匹配,除非'UTF-16'是你的平臺的默認值。 – 2014-11-05 19:11:50