2016-02-03 127 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));'和一切工作正常。非常感谢。 –

相关问题