byte[] 转换成string 时数据丢失的问题
using System;
using System.Collections.Generic;
using System.Text;
using System.Xml.Serialization;
namespace Operate
{
[Serializable]
public class Entity
{
public Entity()
{
}
private string mid;
private string annex;
private string filename;
public string Mid
{
get
{
return mid;
}
set
{
mid = value;
}
}
public string FileName
{
get
{
return filename;
}
set
{
filename = value;
}
}
public string Annex
{
get
{
return annex;
}
set
{
annex = value;
}
}
}
}
上面是一个实体类
foreach (Entity obj in arrayEntity)
{
string strentity = obj.Mid + ";" + obj.FileName + ";" + obj.Annex;//将实体类转换成字符串用socket发送到服务器
if(this.RecvMessage().StartsWith("ok"))
{
this.SendMessage(strentity); //发送到服务器的方法
if (this.RecvMessage().StartsWith("InertAnnexSucessful"))
{
txtState.Text = "服务器成功执行附件: " + obj.FileName + "\r\n" + txtState.Text;
executeAnnex = true;
}
}
}
上面循环发送实体类的字符串
public string recvMessage()
{
byte[] recvBytes = new byte[Int32.Parse(ss)];
int bytes=0;
bytes += s.Receive(recvBytes, recvBytes.Length, 0);
byte[] gb = Encoding.Convert(utf8, gb2312, recvBytes);
string sGb = gb2312.GetString(gb);
}
上面这个是接收消息的方法
public string sendMessage(string mes)
{
byte[] bgb = gb2312.GetBytes(mes);
byte[] butf = Encoding.Convert(gb2312, utf8, bgb);
client.Send(butf);
}
上面这个是发送到服务器的方法
while (true)
{
string ss = this.RecvMessage();
if (ss.StartsWith("Close"))
{
CloseSocketList.Add(s);
break;
}
else
{
this.SendMessage("ok");
byte[] recvBytes = new byte[Int32.Parse(ss)];
int bytes=0;
bytes += s.Receive(recvBytes, recvBytes.Length, 0);//这里可以完全接收到数据
byte[] gb = Encoding.Convert(utf8, gb2312, recvBytes);这个转换就丢失了一些数据了,不知道怎么解决
string sGb = gb2312.GetString(gb);
string[] vv = sGb.Split(';');
int i = 0;
foreach (string ssss in vv)
{
if (i == 0)
{
entity.Mid = ssss;
}
if (i == 1)
{
entity.FileName = ssss;
}
if (i == 2)
{
entity.Annex = ssss;
} i += 1;
}
if (this.InsertAnnex(entity.Mid, Convert.FromBase64String(entity.Annex), entity.FileName))//插入数据库的方法
{
txtState.Text = "成功执行客户端上传的附件:" + entity.FileName + "\r\n" + txtState.Text;
string sendStr = "InertAnnexSucessful";
this.SendMessage(sendStr);
}
}
Thread.Sleep(3000);
}
[解决办法]
你不要那样转换,我刚遇到了你的问题,已解决了,就是字节流转换成字符串的问题,我给你看看我的代码
客户端:
/**/
///向服务器发送信息
string sendStr = textBox3.Text;
byte[] bs = Encoding.Default.GetBytes(sendStr);//把字符串编码为字节
c.Send(bs, bs.Length, 0);//发送信息
/**/
///接受从服务器返回的信息
string recvStr = "";
byte[] recvBytes = new byte[1024];
int bytes;
bytes = c.Receive(recvBytes, recvBytes.Length, 0);//从服务器端接受返回信息
recvStr += Encoding.Default.GetString(recvBytes, 0, bytes);//字节流转换字符串
textBox3.Text = recvStr;//显示服务器返回信息
服务器端:
Socket temp = s.Accept();//为新建连接创建新的socket
string recvStr = "";
byte[] recvBytes = new byte[1024];
int bytes;
bytes = temp.Receive(recvBytes, recvBytes.Length, 0);//从客户端接受信息
recvStr = Encoding.Default.GetString(recvBytes, 0, bytes);//这里就是字节流转换字符串
MessageBox.Show(recvStr );
//给client端返回信息
string sendStr = "发送成功!";
byte[] bs = Encoding.Default.GetBytes(sendStr);
temp.Send(bs, bs.Length, 0);//返回信息给客户端
temp.Close();
你要注意服务器端接受和发送的数据格式,还有客户端接收和发送的数据格式
string abc=Encoding.Default.GetString(参数,参数,参数);
服务器端和客户端两边都这样接收和发送就ok!