2017-01-12 17 views
0

我正在尝试构建一个tcp客户端和一个与unicode一起工作的服务器。服务器处于C#,看起来像:java客户端和C#服务器使用unicode

static void Main(string[] args) 
    { 
     // tcp setup 
     TcpListener serverSocket = new TcpListener(8888); 
     TcpClient clientSocket = default(TcpClient); 
     serverSocket.Start(); 

     // waiting for client to connect 
     clientSocket = serverSocket.AcceptTcpClient(); 

     // client comunication 
     string resAscii = Recv(clientSocket); 
     Send(clientSocket, "got from you: " + resAscii); 
     string resUnicode = Recv(clientSocket); 
     Send(clientSocket, "קיבלתי ממך: " + resUnicode); 
     Console.ReadKey(); 
    } 

    public static void Send(TcpClient client, string msg) 
    { 
     Byte[] sendtBytes = Encoding.Unicode.GetBytes(msg + "$"); 
     client.GetStream().Write(sendtBytes, 0, sendtBytes.Length); 
     client.GetStream().Flush(); 
    } 
    public static string Recv(TcpClient client) 
    { 
     byte[] recvBytes = new byte[65537]; 
     client.GetStream().Read(recvBytes, 0, (int)client.ReceiveBufferSize); 
     string dataFromClient = System.Text.Encoding.Unicode.GetString(recvBytes); 
     dataFromClient = dataFromClient.Substring(0, dataFromClient.IndexOf('$')); 
     return dataFromClient; 
    } 

和客户端是在java(机器人):

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    new Thread(new Runnable() { 
     @Override 
     public void run() { 
      try { 
       Socket s = new Socket("192.168.0.102", 8888); 
       Send(s, "this is ascii"); 
       String asciiString = Recv(s); 
       Send(s, "זה יוניקוד"); 
       String unicodeString = Recv(s); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    }).start(); 
} 


private String Recv(Socket s) throws IOException { 
    byte[] b = new byte[10080]; 
    int read = s.getInputStream().read(b, 0, 1000); 
    String ret = new String(b, "UTF16"); 
    ret = ret.substring(0, ret.indexOf('$')); 
    return ret; 
} 

private void Send(Socket s, String msg) throws IOException { 
    s.getOutputStream().write((msg + "$").getBytes("UTF16")); 
} 

当我从客户端发送到服务器我得到的消息。但是当服务器发送给客户端时我只能得到中文字母: client (android) error 我该如何解决它?

+1

尝试'getBytes(StandardCharsets.UTF_16LE)'? http://stackoverflow.com/questions/33175545/encoding-unicode-getbytes-c-sharp-to-java – flakes

+0

“这是ascii”:说它不这样做;它是UTF-16,因为这是一个字符串。 –

+0

@flakes如果你在我身边我会吻你... – roni

回答

1

正如@flakes说那是答案。 改变这一行的Recv功能:

String ret = new String(b, "UTF16"); 

这一行:

 String ret = new String(b, StandardCharsets.UTF_16LE); 

s.getOutputStream().write((msg + "$").getBytes("UTF16")); 

与该线路Send文件:

 s.getOutputStream().write((msg + "$").getBytes(StandardCharsets.UTF_16LE)); 
+0

这是因为[解码时,UTF-16 charset在输入流的开始处解释字节顺序标记以指示流的字节顺序,但默认为big-endian if没有字节顺序标记;编码时,它使用big-endian字节顺序并写入一个big-endian字节顺序标记。](https://docs.oracle.com/javase/8/docs/api/java/nio/charset/Charset.html ) –