2016-02-03 174 views
1

我讀了其他關於這個問題的SO問題,沒有任何解決我的問題,所以我覺得這個帖子不是重複的。發送unicode字符串到服務器套接字

我想發送一個Unicode字符串從android客戶端套接字到服務器套接字但是我從服務器(我在Windows上使用c#服務器)接收所有Unicode字符作爲問號。我使用WireShark來監視網絡,並將所有Unicode字符顯示爲點。這是我的發送代碼:

String msg = "تست سوکت"; 

PrintWriter out = new PrintWriter(new BufferedWriter(
    new OutputStreamWriter(socket.getOutputStream())), 
    true); 

out.println(msg); 
out.flush(); 

一些StackOverflow上的問題說,加入charSetEncoderOutputStreamWriter constractor可以解決這一點,但,這不是爲我工作,結果是一樣的:

PrintWriter out = new PrintWriter(new BufferedWriter(
       new OutputStreamWriter(socket.getOutputStream(), 
         Charset.forName("UTF-8").newEncoder())), 
       true); 
// Or 
PrintWriter out = new PrintWriter(new BufferedWriter(
       new OutputStreamWriter(socket.getOutputStream(), 
         "UTF-8")), 
       true); 

我嘗試之後將字節數組作爲字符串發送,但不向服務器發送任何內容:

byte[] byteArray = msg.getBytes(Charset.forName("UTF-8")); 
out.println(byteArray.toString() + "\n"); 
+1

你確定問題出在java客戶端代碼中,而不是在服務器C#代碼中? – Gavriel

+0

'之後,我嘗試發送字符數組作爲字符串,'。這不是一個好主意。你應該發送字節數組本身。所以你不能使用println()。使用write()。試用msg.getBytes。你當然應該顯示接收的C#代碼。 – greenapps

+0

@Gavriel問題出在服務器代碼上,但wireShark的結果讓我相信這是客戶端問題。謝謝你的幫助。 –

回答

2

您的Java代碼是正確的。

Wireshark沒有顯示unicode字符可以設置Wireshark的限制。

因此接收C#程序必須是問題。你確定這個程序需要一串UTF-8字符嗎? Windows和C#上的「Unicode」通常表示UTF-16,而不是UTF-8。

+0

我使用'state.sb.Append(Encoding.ASCII.GetString(state.buffer,0,bytesRead));'在我的服務器讀取內容,我只是把它改成'state.sb.Append(Encoding.UTF8。 GetString(state.buffer,0,bytesRead));'和一切工作正常。非常感謝。 –

相關問題