请教socket文件传输问题!

cyclone_li 2016-07-10 09:38:22
最近在做文件传输,遇到一个小问题困扰了很久:文件传输完成后,本地显示文件是0KB,也就是还没有从缓冲区写入,而我已经使用了filestream.flush() , filestream.close()也没有效果。只有使用sokcet..close()或者关闭例程之后,本地文件才能写入。而关闭socket连接不利于我接下去的操作。
我猜测是socket连接与filestream之间的连接没有被切断,导致我接下去的程序代码都无法继续执行,不知道该如何解决,求助各位!
...全文
201 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
小程序员 2016-07-12
  • 打赏
  • 举报
回复
引用 6 楼 qq_28193895 的回复:
[quote=引用 4 楼 huang461072830 的回复:] 文件流没释放的关系。。。。写文件加上 usin(filestream.....) { }
//获得主机号 string sen = System.Text.Encoding.Unicode.GetString(Receive.ReceiveVarData(soc)); //获得接收者 string rece = System.Text.Encoding.Unicode.GetString(Receive.ReceiveVarData(soc)); //获得[文件名] string trueFileName = System.Text.Encoding.Unicode.GetString(Receive.ReceiveVarData(soc)); //获得[包的大小] string bagSize = System.Text.Encoding.Unicode.GetString(Receive.ReceiveVarData(soc)); //获得[包的总数量] int bagCount = int.Parse(System.Text.Encoding.Unicode.GetString(Receive.ReceiveVarData(soc))); //获得[最后一个包的大小] string bagLast = System.Text.Encoding.Unicode.GetString(Receive.ReceiveVarData(soc)); string filepath = SavePath + trueFileName; FileStream MyFileStream = new FileStream(filepath, FileMode.Create, FileAccess.Write); //已发送包的个数 int SendedCount = 0; while (true) { byte[] data = Receive.ReceiveVarData(soc); if (data.Length == 0) { break; } else { SendedCount++; //将接收到的数据包写入到文件流对象 MyFileStream.Write(data, 0, data.Length); } } MyFileStream.Flush(); //关闭文件流 MyFileStream.Close(); 求指导 谢谢![/quote] MyFileStream.Write(data, 0, data.Length); 这个地方,每次索引都从0开始?那永远myfilestream长度永远等于最后一个data.length吧 int indexlength=0; while(true) { ..... MyFileStream.Write(data, indexlingth, data.Length); indexlength+=data.length; ..... }
cyclone_li 2016-07-12
  • 打赏
  • 举报
回复
引用 11 楼 huang461072830 的回复:
[quote=引用 6 楼 qq_28193895 的回复:] [quote=引用 4 楼 huang461072830 的回复:] 文件流没释放的关系。。。。写文件加上 usin(filestream.....) { }
//获得主机号 string sen = System.Text.Encoding.Unicode.GetString(Receive.ReceiveVarData(soc)); //获得接收者 string rece = System.Text.Encoding.Unicode.GetString(Receive.ReceiveVarData(soc)); //获得[文件名] string trueFileName = System.Text.Encoding.Unicode.GetString(Receive.ReceiveVarData(soc)); //获得[包的大小] string bagSize = System.Text.Encoding.Unicode.GetString(Receive.ReceiveVarData(soc)); //获得[包的总数量] int bagCount = int.Parse(System.Text.Encoding.Unicode.GetString(Receive.ReceiveVarData(soc))); //获得[最后一个包的大小] string bagLast = System.Text.Encoding.Unicode.GetString(Receive.ReceiveVarData(soc)); string filepath = SavePath + trueFileName; FileStream MyFileStream = new FileStream(filepath, FileMode.Create, FileAccess.Write); //已发送包的个数 int SendedCount = 0; while (true) { byte[] data = Receive.ReceiveVarData(soc); if (data.Length == 0) { break; } else { SendedCount++; //将接收到的数据包写入到文件流对象 MyFileStream.Write(data, 0, data.Length); } } MyFileStream.Flush(); //关闭文件流 MyFileStream.Close(); 求指导 谢谢![/quote] MyFileStream.Write(data, 0, data.Length); 这个地方,每次索引都从0开始?那永远myfilestream长度永远等于最后一个data.length吧 int indexlength=0; while(true) { ..... MyFileStream.Write(data, indexlingth, data.Length); indexlength+=data.length; ..... }[/quote] 不是这个问题,是while(true)的问题 。谢谢你的参与。
cyclone_li 2016-07-12
  • 打赏
  • 举报
回复
引用 9 楼 johnliuyuan 的回复:
你判断是否接受完最好用文件的实际大小作为判定条件,当接收到足够的字节数时就退出。别忘了,你发送的文件可能和别的消息粘在一起,你得处理这种情况。另外最好是每写入一次就flush一次
是的 就是这个问题! 终于发现了 ,谢谢!
cyclone_li 2016-07-12
  • 打赏
  • 举报
回复
引用 10 楼 shingoscar 的回复:
1、如果文件已经存在,FileMode.Create会覆盖掉原先的文件 2、Receive.ReceiveVarData是什么?它确实有返回数据么?
1.覆盖问题在别的地方处理了,因为和本问题没什么关联,所以没有贴出。 2.如代码所示,返回类型是 byte [ ] 我找到自己的问题了,不应该用while(true)的 因为这样无法找到接收的终点。 感谢你的参与 !
Poopaye 2016-07-11
  • 打赏
  • 举报
回复
1、如果文件已经存在,FileMode.Create会覆盖掉原先的文件 2、Receive.ReceiveVarData是什么?它确实有返回数据么?
john_QQ:2335298917 2016-07-11
  • 打赏
  • 举报
回复
你判断是否接受完最好用文件的实际大小作为判定条件,当接收到足够的字节数时就退出。别忘了,你发送的文件可能和别的消息粘在一起,你得处理这种情况。另外最好是每写入一次就flush一次
john_QQ:2335298917 2016-07-11
  • 打赏
  • 举报
回复
你这个包的总数量有什么用呢?TCP有粘包和半包的现象,实际发送的包可能和你预设的不一样
Justin-Liu 2016-07-11
  • 打赏
  • 举报
回复
保存文件的流用完了释放掉
cyclone_li 2016-07-11
  • 打赏
  • 举报
回复
引用 2 楼 FoxDave 的回复:
保存文件的流用完了释放掉
//获得主机号 string sen = System.Text.Encoding.Unicode.GetString(Receive.ReceiveVarData(soc)); //获得接收者 string rece = System.Text.Encoding.Unicode.GetString(Receive.ReceiveVarData(soc)); //获得[文件名] string trueFileName = System.Text.Encoding.Unicode.GetString(Receive.ReceiveVarData(soc)); //获得[包的大小] string bagSize = System.Text.Encoding.Unicode.GetString(Receive.ReceiveVarData(soc)); //获得[包的总数量] int bagCount = int.Parse(System.Text.Encoding.Unicode.GetString(Receive.ReceiveVarData(soc))); //获得[最后一个包的大小] string bagLast = System.Text.Encoding.Unicode.GetString(Receive.ReceiveVarData(soc)); string filepath = SavePath + trueFileName; FileStream MyFileStream = new FileStream(filepath, FileMode.Create, FileAccess.Write); //已发送包的个数 int SendedCount = 0; while (true) { byte[] data = Receive.ReceiveVarData(soc); if (data.Length == 0) { break; } else { SendedCount++; //将接收到的数据包写入到文件流对象 MyFileStream.Write(data, 0, data.Length); } } MyFileStream.Flush(); //关闭文件流 MyFileStream.Close(); 求指导 谢谢!
cyclone_li 2016-07-11
  • 打赏
  • 举报
回复
引用 4 楼 huang461072830 的回复:
文件流没释放的关系。。。。写文件加上 usin(filestream.....) { }
//获得主机号 string sen = System.Text.Encoding.Unicode.GetString(Receive.ReceiveVarData(soc)); //获得接收者 string rece = System.Text.Encoding.Unicode.GetString(Receive.ReceiveVarData(soc)); //获得[文件名] string trueFileName = System.Text.Encoding.Unicode.GetString(Receive.ReceiveVarData(soc)); //获得[包的大小] string bagSize = System.Text.Encoding.Unicode.GetString(Receive.ReceiveVarData(soc)); //获得[包的总数量] int bagCount = int.Parse(System.Text.Encoding.Unicode.GetString(Receive.ReceiveVarData(soc))); //获得[最后一个包的大小] string bagLast = System.Text.Encoding.Unicode.GetString(Receive.ReceiveVarData(soc)); string filepath = SavePath + trueFileName; FileStream MyFileStream = new FileStream(filepath, FileMode.Create, FileAccess.Write); //已发送包的个数 int SendedCount = 0; while (true) { byte[] data = Receive.ReceiveVarData(soc); if (data.Length == 0) { break; } else { SendedCount++; //将接收到的数据包写入到文件流对象 MyFileStream.Write(data, 0, data.Length); } } MyFileStream.Flush(); //关闭文件流 MyFileStream.Close(); 求指导 谢谢!
cyclone_li 2016-07-11
  • 打赏
  • 举报
回复
引用 1 楼 shingoscar 的回复:
100%是你写的有问题,什么连接没有被切断,异想天开
//获得主机号 string sen = System.Text.Encoding.Unicode.GetString(Receive.ReceiveVarData(soc)); //获得接收者 string rece = System.Text.Encoding.Unicode.GetString(Receive.ReceiveVarData(soc)); //获得[文件名] string trueFileName = System.Text.Encoding.Unicode.GetString(Receive.ReceiveVarData(soc)); //获得[包的大小] string bagSize = System.Text.Encoding.Unicode.GetString(Receive.ReceiveVarData(soc)); //获得[包的总数量] int bagCount = int.Parse(System.Text.Encoding.Unicode.GetString(Receive.ReceiveVarData(soc))); //获得[最后一个包的大小] string bagLast = System.Text.Encoding.Unicode.GetString(Receive.ReceiveVarData(soc)); string filepath = SavePath + trueFileName; FileStream MyFileStream = new FileStream(filepath, FileMode.Create, FileAccess.Write); //已发送包的个数 int SendedCount = 0; while (true) { byte[] data = Receive.ReceiveVarData(soc); if (data.Length == 0) { break; } else { SendedCount++; //将接收到的数据包写入到文件流对象 MyFileStream.Write(data, 0, data.Length); } } MyFileStream.Flush(); //关闭文件流 MyFileStream.Close(); 求指导 谢谢!
小程序员 2016-07-11
  • 打赏
  • 举报
回复
文件流没释放的关系。。。。写文件加上 usin(filestream.....) { }
showjim 2016-07-11
  • 打赏
  • 举报
回复
很正常的系统缓存功能,你访问文件相关内容的时候自然会写入。
Poopaye 2016-07-10
  • 打赏
  • 举报
回复
100%是你写的有问题,什么连接没有被切断,异想天开

110,537

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧