用C# socket接收数据,服务器端是java发送,客户端是c#接收,当数据量也比较大,(数据编码格式GB2312)由于返回的数据中包含汉字、数字 、字符,大部分情况下接收到的数据显示正常,但有时会出现乱码,经过观察发现,由于GB2312中一个汉字由两个字符组成,而字符、数字由一个字符组成 。 当数据过大时可能把汉字截断,只发送第一个字节过来,而第二个字节在下一批包里发送 下面是接收数据部分的主要代码private void ReceiveCallback(IAsyncResult ar)
{
try
{
State state = (State) ar.AsyncState;
Socket client = state.WorkSocket; // 从远程设备读取数据
int bytesRead = client.EndReceive(ar); if (bytesRead > 0)
{
InputFeed(state.Buffer, bytesRead);
Negotiate(state.Buffer); //接收数据
DataAvailable(this,
new DataAvailableEventArgs(Encoding.GetEncoding("GB2312").GetString(state.Buffer, 0, bytesRead)));
// 继续接收剩下的数据.
client.BeginReceive(state.Buffer, 0, State.BufferSize, 0,
new AsyncCallback(ReceiveCallback), state);
}
else
{
// 事件信号完成
if(cmdEnd)
Disconnect();
}
catch (Exception e)
{
Disconnect();
throw new ApplicationException(e.Message);
}下面是返回的数据 基站编号 基站名称 小区号 扇区号 载频号 系统类型 管理状态 操作状态 使用状态 168 石巷 168 4 0 CDMA2000 1X 解锁 使能 激活
168 石巷 168 4 1 CDMA2000 1X 解锁 使能 ?せ? 请问如何判断最后一个字节是不是汉字的字节,将这个字节提取出来,将这个字节与下一批的第一个字节拼成一个完整的汉字?小弟现在没什么积分 希望各位帮帮忙
{
try
{
State state = (State) ar.AsyncState;
Socket client = state.WorkSocket; // 从远程设备读取数据
int bytesRead = client.EndReceive(ar); if (bytesRead > 0)
{
InputFeed(state.Buffer, bytesRead);
Negotiate(state.Buffer); //接收数据
DataAvailable(this,
new DataAvailableEventArgs(Encoding.GetEncoding("GB2312").GetString(state.Buffer, 0, bytesRead)));
// 继续接收剩下的数据.
client.BeginReceive(state.Buffer, 0, State.BufferSize, 0,
new AsyncCallback(ReceiveCallback), state);
}
else
{
// 事件信号完成
if(cmdEnd)
Disconnect();
}
catch (Exception e)
{
Disconnect();
throw new ApplicationException(e.Message);
}下面是返回的数据 基站编号 基站名称 小区号 扇区号 载频号 系统类型 管理状态 操作状态 使用状态 168 石巷 168 4 0 CDMA2000 1X 解锁 使能 激活
168 石巷 168 4 1 CDMA2000 1X 解锁 使能 ?せ? 请问如何判断最后一个字节是不是汉字的字节,将这个字节提取出来,将这个字节与下一批的第一个字节拼成一个完整的汉字?小弟现在没什么积分 希望各位帮帮忙
如果在176-247之间就说明是半个汉字,把它截掉并补到下一批数据的头上
{
char c = (char)bytes[bytes.Length - 1];
if (176 <= c && c <= 247)
{
Console.WriteLine("最后一个字节是汉字的一半");
}
}
我现在的问题是每1024byte转一次string 可能出现byte[1024]是汉字byte组成的一半 造成乱码的出现