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|____________________我觉得很困惑,希望能够得到各位的指点,谢谢
刚刚测试了下,整体都没问题,但是却有个地方比较蛋疼先说正常的
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|____________________我觉得很困惑,希望能够得到各位的指点,谢谢
解决方案 »
- 各位大神求解,Android项目后提示@override错误怎么办。
- 有人知道这个是怎么实现的吗?
- 求android底层源代码,
- 安卓框架怎么学习
- 如何监听 Android 中Contacts 的更新
- 求助:有那位大哥做过android 下红外遥控的给小弟一些方案,最好有源代码的...谢谢...
- 关于在全屏下屏蔽Home按钮,睡眠唤醒后为何全屏失效?
- 怪事,从这个activity进不了下个activity了
- Android 证书问题,求指导,万分感谢。
- android工程如何打开office文档和pdf
- android listview 自定义样式
- 最新的新浪微博android SDK的weibo.java
接收端再进行重新解码编码为合适的编码。
stringBuilder.ToString().TrimEnd('\0')就可以正常显示了不过,还是没有弄清楚这个'\0'是哪一边生成的不知道到底是Android的OutputStream.flush()生成的
(不会是Android读取EditText的字符串的问题,因为我把发送出去的byte[]在Android端重新生成字符串观察,一切正常)还是C#的System.Text.Encoding.Default.GetChars()生成的
可是同样的代码传输纯英文、数字却没有问题,只要加入汉字(英文汉字混杂也一样),就会在末端生成一个'\0',但汉字本身的传输却没有问题,汉字显示正常
囧虽然有解决方法了,但是还是希望能够有高手来给我解惑,谢谢!
就是flush这玩意给加的....