Java的OutputStream的flush方法是不是会自动在末端加入结束符?

dyqelz 2011-05-05 01:18:26
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|____________________



我觉得很困惑,希望能够得到各位的指点,谢谢
...全文
878 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
ccsdsx 2011-10-11
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 dyqelz 的回复:]

早上又测试了一下,把byte[]打印成char[],发现在传输之后确实在末端生成了一个'\0',即char[]最后一位的打印结果是 0

找到了一个解决方法,在C#服务器端收到数据形成StringBuilder后,加一句
stringBuilder.ToString().TrimEnd('\0')就可以正常显示了

不过,还是没有弄清楚这个'\0'是哪一边生成的

不知道到底是An……
[/Quote]

就是flush这玩意给加的....
ML_NI_CSU 2011-10-10
  • 打赏
  • 举报
回复
很无奈
dyqelz 2011-05-05
  • 打赏
  • 举报
回复
早上又测试了一下,把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',但汉字本身的传输却没有问题,汉字显示正常。。。


囧。。。虽然有解决方法了,但是还是希望能够有高手来给我解惑,谢谢!
dyqelz 2011-05-05
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 hslinux 的回复:]

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

汉字传输是正常的,并非乱码,问题在于不知为何在C#端的程序中,字符串末尾自动生成了一个'\0'
hslinux 2011-05-05
  • 打赏
  • 举报
回复
汉字传输前请先用utf8编码,再转换成byte[],
接收端再进行重新解码编码为合适的编码。

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧