Client端把自定义的Report对象分成多个定长的包发送,在Server端也按同样的定长接收。但接收到包的数量总是大于发送的数量,而且虽然反序列化能成功,但从反序列化所得到的Report对象中的byte[]字段的长度比Client端发送时要长。这个byte[]是用来保存图片的,出现这种情况导致图片不能正常在Server端显示。而且在Report对象中只有这个byte[]的字段出现问题,其他3个String型的字段都没有问题。这个问题当Client端和Server端在同一台计算机上时是不会出现的,应该和网络传输有关,但我不清楚到底是哪里的问题。下面是代码,希望各位高手指点一二。Report类public class Report
{
public string textOne;
public string textTwo;
public byte[] pic;
public string textThree;
}
Client端代码 Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint ep = new IPEndPoint(Dns.GetHostEntry("12.23.5.678").AddressList[0], 9999); socket.Connect(ep); XmlSerializer xs = new XmlSerializer(typeof(Report));
StringWriter sw = new StringWriter(); Report report = new Report();
report.textOne= "qwe";
report.textTwo= "asd";
report.textThree= "zxc"; MemoryStream ms = new MemoryStream();
pic.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
report.pic = ms.GetBuffer(); xs.Serialize(sw, report);
string reportString = sw.GetStringBuilder().ToString();
byte[] reportBytes = System.Text.Encoding.Default.GetBytes(reportString); int pos = 0;
int count = 0;
while (pos < reportBytes.Length)
{
byte[] data = new byte[1024];
if (reportBytes.Length - pos >= 1024)
{
Array.Copy(reportBytes, pos, data, 0, 1024);
}
else
{
Array.Copy(reportBytes, pos, data, 0, reportBytes.Length - pos);
}
socket.Send(data);
count++;
pos += 1024;
}
socket.Shutdown(SocketShutdown.Both);
socket.Close();
Server端代码 socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
ep = new IPEndPoint(Dns.GetHostEntry("12.23.5.678").AddressList[0], 9999); socket.Bind(ep);
socket.Listen(100); Socket client = socket.Accept(); byte[] data = new byte[1024]; MemoryStream ms = new MemoryStream();
int count = 0;
while (client.Receive(data) > 0)
{
count++;
ms.Write(data, 0, 1024);
}
Console.Write(count); string stepOne = System.Text.Encoding.Default.GetString(ms.GetBuffer()); XmlSerializer ser = new XmlSerializer(typeof(Report));
StringReader sr = new StringReader(stepOne);
Report report = (Report)ser.Deserialize(sr); return report;
{
public string textOne;
public string textTwo;
public byte[] pic;
public string textThree;
}
Client端代码 Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint ep = new IPEndPoint(Dns.GetHostEntry("12.23.5.678").AddressList[0], 9999); socket.Connect(ep); XmlSerializer xs = new XmlSerializer(typeof(Report));
StringWriter sw = new StringWriter(); Report report = new Report();
report.textOne= "qwe";
report.textTwo= "asd";
report.textThree= "zxc"; MemoryStream ms = new MemoryStream();
pic.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
report.pic = ms.GetBuffer(); xs.Serialize(sw, report);
string reportString = sw.GetStringBuilder().ToString();
byte[] reportBytes = System.Text.Encoding.Default.GetBytes(reportString); int pos = 0;
int count = 0;
while (pos < reportBytes.Length)
{
byte[] data = new byte[1024];
if (reportBytes.Length - pos >= 1024)
{
Array.Copy(reportBytes, pos, data, 0, 1024);
}
else
{
Array.Copy(reportBytes, pos, data, 0, reportBytes.Length - pos);
}
socket.Send(data);
count++;
pos += 1024;
}
socket.Shutdown(SocketShutdown.Both);
socket.Close();
Server端代码 socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
ep = new IPEndPoint(Dns.GetHostEntry("12.23.5.678").AddressList[0], 9999); socket.Bind(ep);
socket.Listen(100); Socket client = socket.Accept(); byte[] data = new byte[1024]; MemoryStream ms = new MemoryStream();
int count = 0;
while (client.Receive(data) > 0)
{
count++;
ms.Write(data, 0, 1024);
}
Console.Write(count); string stepOne = System.Text.Encoding.Default.GetString(ms.GetBuffer()); XmlSerializer ser = new XmlSerializer(typeof(Report));
StringReader sr = new StringReader(stepOne);
Report report = (Report)ser.Deserialize(sr); return report;
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货