RT我正准备做一个Android客户端与C#服务端进行网络通信的功能模块
刚刚测试了下,整体都没问题,但是却有个地方比较蛋疼先说正常的
C#服务器端发送英文、汉字给Android客户端,Android客户端接收正常,显示正常
代码如下:
Android客户端
try {     
sb=new StringBuffer();
socket = new Socket(serverIP, port);

accStream = socket.getInputStream();
byte[] container=new byte[1024];
Log.d(TAG, "container.length="+container.length);
int byteNum;
while((byteNum=accStream.read(container))!=-1){
//如果读取的字节数比缓冲区的长度小,则需要截取
if(byteNum<container.length){
sb.append(new String(container,0,byteNum,"GBK"));
}
else {
sb.append(new String(container,"GBK"));
}
Log.d(TAG, byteNum+" bytes read");
}

String receivedStr=sb.toString()+"|";
data_tv.setText(receivedStr);
socket.close();
} catch (Exception e) {
Log.d(TAG, e.getMessage());
}C#服务器端
while (!done)
            {
                s = listener.AcceptSocket();
                byte[] sendBytes = Encoding.Default.GetBytes("发送汉字");                try
                {                 
                    s.Send(sendBytes, sendBytes.Length,0);
                    s.Close();
                }
                catch (Exception ee)
                {
                    MessageBox.Show(ee.ToString());
                }
            }               
上面的这一部分都是正常的,不看也可以
————————————————————————————————————————————————————————下面就出问题了,即Android客户端发送汉字到C#服务器端出了点问题
Android客户端发送汉字
try {     
socket = new Socket(serverIP, port);
convertStream= new ByteArrayInputStream(send_text.getText().toString().getBytes("GB2312"));
sendStream = socket.getOutputStream();
byte[] container=new byte[1024];
int byteNum;

while((byteNum=convertStream.read(container))!=-1){
sendStream.write(container, 0, (byteNum<container.length?byteNum:container.length));
Log.d(TAG, byteNum+" bytes wrote");
}
sendStream.flush();
socket.close();
status_TV.setText("socket closed");
} catch (Exception e) {
Log.d(TAG, e.getMessage());
}C#服务器端接收汉字
try
                    {
                        Console.WriteLine("init variables");
                        s = listener.AcceptSocket();
                        byte[] container = new byte[1024];
                        sb = new StringBuilder();
                        Console.WriteLine("start loop");
                        while ((byteNum = s.Receive(container)) != 0)
                        {
                            Console.WriteLine("looping");
                            if (byteNum < container.Length)
                            {
                                sb.Append(System.Text.Encoding.Default.GetChars(container), 0, byteNum);
                            }
                            else
                            {
                                sb.Append(container);
                            }
                        }
                        sb.Append("|");
                        Console.WriteLine("loop end");
                        Console.WriteLine("__________________" + sb.ToString() + "____________________");
                        s.Close();
                    }
                    catch(Exception e) {
                        Console.WriteLine(e.Message);
                    }C#服务器端接收汉字是正常的,但是收到汉字之后的显示却不正常
按理说Console.WriteLine("__________________" + sb.ToString() + "____________________");这一句的打印结果应该是__________________待发送|____________________但是实际显示却是__________________待发送即后面的sb.Append("|");没有生效,sb.ToString() + "____________________"的"____________________"也没有加进去
我感觉可能是在转码之后字节流里面被加入了一个结束符,但是我不知道究竟是在哪一边加进去的,到底是Android的Java的getBytes("GB2312")加进去的,还是C#的Encoding.Default.GetChars加进去的?Android发送英文给C#服务器是没有任何问题的,可以正常显示
__________________to be sent|____________________我觉得很困惑,希望能够得到各位的指点,谢谢

解决方案 »

  1.   

    汉字传输前请先用utf8编码,再转换成byte[],
    接收端再进行重新解码编码为合适的编码。
      

  2.   

    早上又测试了一下,把byte[]打印成char[],发现在传输之后确实在末端生成了一个'\0',即char[]最后一位的打印结果是 0找到了一个解决方法,在C#服务器端收到数据形成StringBuilder后,加一句
    stringBuilder.ToString().TrimEnd('\0')就可以正常显示了不过,还是没有弄清楚这个'\0'是哪一边生成的不知道到底是Android的OutputStream.flush()生成的
    (不会是Android读取EditText的字符串的问题,因为我把发送出去的byte[]在Android端重新生成字符串观察,一切正常)还是C#的System.Text.Encoding.Default.GetChars()生成的
    可是同样的代码传输纯英文、数字却没有问题,只要加入汉字(英文汉字混杂也一样),就会在末端生成一个'\0',但汉字本身的传输却没有问题,汉字显示正常
    囧虽然有解决方法了,但是还是希望能够有高手来给我解惑,谢谢!
      

  3.   


    就是flush这玩意给加的....