我用了一个循环从缓冲区中读取从服务器端发送过来的已经序列化的数据,用到了MemoryStream对象
反序列化方法中采用了MemoryStream对象作为参数。但是总是时不时显示异常:在分析完成之前就遇到结尾流
代码如下:接收时的循环:
public void SyncSocketReceive()
{
int bytesRead=0;
byte[] buffer = new byte[1024];
MemoryStream ms = new MemoryStream();
do
{
bytesRead=syncsocket.Receive(buffer);
ms.Write(buffer, 0, bytesRead);
//offset += bytesRead;
}
while (bytesRead==1024);
ms.Seek(0, SeekOrigin.Begin);//置零
dsclient = DeserializeDate.Deserialize(ms);
}
反序列化的函数:
public static DataSet Deserialize(MemoryStream ms)
{
MemoryStream ms = new MemoryStream();
//ms.Write(Recbtyes, 0, Recbtyes.Length);
ms.Seek(0, SeekOrigin.Begin);//再次置零
//MessageBox.Show(ms.Length.ToString());
IFormatter bf = new BinaryFormatter();
object obj = bf.Deserialize(ms); //总在这里有问题,时好时坏
DataSet dsResult = (DataSet)obj;
ms.Close();
return dsResult;
}
断点调试过,置零都有有效的,但是一到object obj = bf.Deserialize(ms) ms的Position属性的值就变成最大值了
有谁知道怎么解决么?
反序列化方法中采用了MemoryStream对象作为参数。但是总是时不时显示异常:在分析完成之前就遇到结尾流
代码如下:接收时的循环:
public void SyncSocketReceive()
{
int bytesRead=0;
byte[] buffer = new byte[1024];
MemoryStream ms = new MemoryStream();
do
{
bytesRead=syncsocket.Receive(buffer);
ms.Write(buffer, 0, bytesRead);
//offset += bytesRead;
}
while (bytesRead==1024);
ms.Seek(0, SeekOrigin.Begin);//置零
dsclient = DeserializeDate.Deserialize(ms);
}
反序列化的函数:
public static DataSet Deserialize(MemoryStream ms)
{
MemoryStream ms = new MemoryStream();
//ms.Write(Recbtyes, 0, Recbtyes.Length);
ms.Seek(0, SeekOrigin.Begin);//再次置零
//MessageBox.Show(ms.Length.ToString());
IFormatter bf = new BinaryFormatter();
object obj = bf.Deserialize(ms); //总在这里有问题,时好时坏
DataSet dsResult = (DataSet)obj;
ms.Close();
return dsResult;
}
断点调试过,置零都有有效的,但是一到object obj = bf.Deserialize(ms) ms的Position属性的值就变成最大值了
有谁知道怎么解决么?
do
{
bytesRead=syncsocket.Receive(buffer);
ms.Write(buffer, 0, bytesRead);
//offset += bytesRead;
}
while (bytesRead==1024); //这里,你不能规定它每次必须读到1024个字节
//网络数据的传送不能想当然
//改成while(bytesRead>0)
对, 并且如果服务器没有发送数据, 而客户端认为有数据 Read 会阻塞在那里
小弟愚钝,有谁能贴的代码吗
to Dobzhansky(Stones)
我就是不大清楚这个。
当bytesRead不为0的时候,接收的时候就是不完整的,所以会产生"在分析完成之前就遇到结尾流"的异常
另外while (bytesRead==1024);这个条件作为循环结束条件,必须满足网络通畅的条件,并且服务器端的数据是一次Send过来的,或者在完成之前每次都Send 1024的倍数字节.