繁体   English   中英

Java客户端和C#服务器使用Unicode

[英]java client and C# server working with unicode

我正在尝试构建一个tcp客户端和一个可以与unicode一起使用的服务器。 服务器在C# ,如下所示:

    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 (android)中:

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"));
}

从客户端发送到服务器时,收到消息。 但是,当服务器发送给客户端时,我只会收到中文字母: 客户端(android)错误,该如何解决?

正如@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));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM