【问题标题】:java client and C# server working with unicode使用 unicode 的 java 客户端和 C# 服务器
【发布时间】:2017-05-27 21:44:06
【问题描述】:

我正在尝试构建一个 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"));
}

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

【问题讨论】:

标签: java c# android unicode ascii


【解决方案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));
猜你喜欢
  • 2013-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-26
  • 1970-01-01
  • 2012-10-09
  • 2022-06-16
  • 2011-06-09
相关资源
最近更新 更多