c#中 点对点的大文件传输 什么方法最可靠?
我采用的是 服务端连接后
byte[] data = new byte[1024];
int read=0;
Stream stream=File.OpenRead("路径");
do
{
read=stream.Read(data,0,1024];
netWorkStream.Write(data,0,read);
}
while(read >= 1024);
接收端
byte[] data=new byte[1024];
int read =0;
Stream stream=File.OpenWrite("路径");
do
{
read=NetWorkStream.Read(data,0,1024);
stream.Write(data,0,read);
}
while(read >= 1024);这样的方法理论上可行的,而且在传输小文件的时候也一切正常,但是在传输大文件的时候(上100m)的时候 接收端在没有接收完成的情况下就结束了循环,断点跟踪时发现接收端的read没有读取完流中的数据就<1024了,而发送端其实还在发送中,有办法是 read>0 但是这种发放发送端必须在发送完数据是关闭NetWorkStream才能使接收端的read<=0,但是我现在不想让发送端断开连接而是在发送完毕后继续等待下一条指令,所以敢问有什么方法是比较好的发送文件方式?
我采用的是 服务端连接后
byte[] data = new byte[1024];
int read=0;
Stream stream=File.OpenRead("路径");
do
{
read=stream.Read(data,0,1024];
netWorkStream.Write(data,0,read);
}
while(read >= 1024);
接收端
byte[] data=new byte[1024];
int read =0;
Stream stream=File.OpenWrite("路径");
do
{
read=NetWorkStream.Read(data,0,1024);
stream.Write(data,0,read);
}
while(read >= 1024);这样的方法理论上可行的,而且在传输小文件的时候也一切正常,但是在传输大文件的时候(上100m)的时候 接收端在没有接收完成的情况下就结束了循环,断点跟踪时发现接收端的read没有读取完流中的数据就<1024了,而发送端其实还在发送中,有办法是 read>0 但是这种发放发送端必须在发送完数据是关闭NetWorkStream才能使接收端的read<=0,但是我现在不想让发送端断开连接而是在发送完毕后继续等待下一条指令,所以敢问有什么方法是比较好的发送文件方式?
解决方案 »
- 打开的方式不对?
- vs.net中找不到c#的winform程序模板
- 求助???PublicKeyToken報錯
- c#打印自定义纸型和固定纸型
- 新手求救,程序逻辑错误....
- 数据库连接字符串问题,菜鸟求帮助
- 本人自学了一点C#和ASP.NET却苦于无头无序,对知识虽有少许认识,但仍未入门,请各位大哥指点迷津,谢谢!
- 请问怎么把几个resources文件编译成一个dll文件?
- 看完了C#入门经典和C#技术揭秘,可不可以看一些.Net构架方面的书了
- 关于拖动无边框窗体
- 怎样查找替换一串HTML中的某个标签
- 数据库操作问题,如何一次添加多条记录到同一个表,而且要添加的记录是不确定的(数目可变),能用存储过程写吗?怎么实现呢?
试一下多线程,sleep一点点时间
我写的UDP传输都一点没问题(局域网,把文件分割成40k一个包)
可以这样:
while(true)
{
sleep(100);
read=NetWorkStream.Read(data,0,1024);
if(read<1024)
continue;//这些数据想办法重发,或者按照TCP协议,不太会出现这种事情的吧。我也不是很懂
stream.Write(data,0,read); }
//发送端也sleep一点时间
一楼说的方法可行,实现就是多个步骤。
--------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------
应该传递一个“起始位置”信息,然后接收端在do循环中每次仅接收1M即结束,然后接收端再重新开始接收下一个1M。接收端进程应该在即使意外崩溃时,也可以重新启动从文件尾开始断点续传接受。当接收信息不足1M,说明是最后一块。
--------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------
这种方式好理解,能否说明一下“起始位置”如何表示呢?如果接收端崩溃可以继续从文件尾接收,这段代码该如何实现?
那我现在改成这样大家看看合理不
首先发送一个要发送的文件的信息,文件大小
然后直到本地接收到的数据等于要发送的文件大小位置,这个是外层的循环
里面还有个循环,
do
{
read=NetWorkStream.Read(data,0,1024);
stream.Write(data,0,read);
}
while(read >= 1024); 就用这个来做
我的想法是,就算当内部的循环提前结束了,导致了接收的文件不满,到了外层循环发现文件不满又再次回来流中接收数据直到接收到的数据和发送的数据相符为止。
当然,内部的循环要改写一下
Stream stream = OpenWrite("路径");
stream.seek=stream.length;加上这句,使得后续流都从文件尾写入。这样的方式可行不?