问题描述
我正在处理客户端服务器应用程序,其中服务器使用UDT协议将屏幕图像发送到客户端。下面是我的代码服务器使用二进制写入器发送图像,而客户端使用二进制写入器接收数据。代码可以完美地进行几次迭代,但是经过几次迭代后reader.ReadInt32()读取的数字太大或为负数。我已经阅读了大多数与二进制阅读器相关的问题,但没有发现任何帮助。
服务器代码:
public void SendImage(Bitmap bmp)
{
BinaryWriter writer = new BinaryWriter(CStream);
using (MemoryStream ms=new MemoryStream())
{
bmp.Save(ms,ImageFormat.Jpeg);//save to memory stream
long fileSize = ms.Length;
writer.Write(fileSize); //send length
byte[] buffer = new byte[512 * 1024];
long pos = 0;
ms.Seek(0,SeekOrigin.Begin);
while (pos < fileSize)
{
//If buffer size is smaller then filesize then send in parts
Int32 toSend = buffer.Length < (fileSize - pos)? buffer.Length: (Int32)(fileSize - pos);
ms.Read(buffer,toSend); //read from memory stream to byte array
writer.Write(toSend);
ServerSocket.Send(buffer,toSend);
pos += toSend;
Console.WriteLine(itration + ",fileSize : "+ fileSize + "," + toSend + ",[buffer]: " + buffer[toSend - 3] + "," + buffer[toSend - 2] + "," + buffer[toSend-1]);
}
itration++;
ms.Flush();
ms.Close();
}
}
客户端代码:
private void startRead()
{
while (true)
{
Bitmap inImage = ReceiveImage(Settings.Encrypted);//BitmapFromStream(Settings.Encrypted);
theImage.Image = (Image)inImage;
}
}
private Bitmap ReceiveImage(bool Encrypted)
{
Bitmap img = null;
byte[] buffer;
BinaryReader reader = new BinaryReader(CStream);
using(MemoryStream ms=new MemoryStream())
{
try
{
long size = reader.ReadInt64();//read file length first
buffer = new byte[4 * 1024 * 1024];
long read = 0;
while (read < size)
{
int toRecv = reader.ReadInt32(); //here reader reads wrong value
Console.WriteLine(itration + "filesize " + size + " Byte to read : " + toRecv);
ReadFragment(reader,toRecv,buffer);
ms.Write(buffer,toRecv);
read += toRecv;
}
itration++;
ms.Position = 0;
img = new Bitmap(ms);
}
catch (Exception Ex)
{
Console.WriteLine(Ex.Message + " : " + Ex.StackTrace);
}
buffer = null;
ms.Flush();
ms.Close();
}
reader = null;
return img;
}
private int ReadFragment(BinaryReader reader,int size,byte[] buffer)
{
int read = 0;
while (read < size)
{
read += reader.Read(buffer,read,size - read);
}
return read;
}
这是服务器的控制台输出
0,fileSize : 568633,524288,[buffer]: 0,162,138
0,44345,[buffer]: 31,255,217
1,fileSize : 568468,[buffer]: 2,138,40
1,44180,[buffer]: 3,217
2,fileSize : 578806,[buffer]: 198,177,106
2,54518,[buffer]: 1,217
3,fileSize : 589967,[buffer]: 20,81,64
3,65679,[buffer]: 15,217
11,fileSize : 632653,[buffer]: 243,0
11,108365,217
12,fileSize : 642562,[buffer]: 205,20,85
12,118274,[buffer]: 7,217
13,fileSize : 645552,[buffer]: 236,49,131
13,121264,217
和客户端的colsole输出
0 filesize 568633 Byte to read : 524288
0 filesize 568633 Byte to read : 44345
1 filesize 568468 Byte to read : 524288
1 filesize 568468 Byte to read : 44180
2 filesize 578806 Byte to read : 524288
2 filesize 578806 Byte to read : 54518
3 filesize 589967 Byte to read : 524288
3 filesize 589967 Byte to read : 65679
11 filesize 632653 Byte to read : 524288
11 filesize 632653 Byte to read : 108365
12 filesize 642562 Byte to read : 524288
12 filesize 642562 Byte to read : 118274
13 filesize 645552 Byte to read : 524288
13 filesize 645552 Byte to read : 671776930 <-- here it read either too big number or negative number
Exception thrown: 'System.ArgumentException' in mscorlib.dll
我已经尝试使用binaryformater,protobuf而不是binaryreader,但是经过几次迭代后它仍然停止。帮助我找到原因。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)