public class ClassMsg
{
public String sendkind="";//标识发送状态,如果是"start",表示要准备发送,如果是"sending",说明数据已经开始在发了,如果是"end",说明发完了,start和end时Data是空数据,数据只在sending状态发送 public String FileName = "";//文件名 public byte[] Data;//文件转化成byte[]流,并且切成很多份
}
服务器通过socket不停的发送一个对象ClassMsg到客户端来传送一份文件,
客户端在接受的时候:
分3部写:switch(ClassMsg.sendkind)
{
case start:
{
FileStream fs= File.Create(ClassMsg.FileName);//新建文件名为FileName的文件
break;
}
case sending:
{
FileStream fs=File.OpenWrite(ClassMsg.FileName);//将本地未接受完的文件载入到fs中
fs.Seek(0, SeekOrigin.End);//将该流的当前位值设为0
fs.Write(ClassMsg.Data, 0, ClassMsg.Data.Length);//向文件中写入当前接收的信息
break;
}
case end:
{
this.textbox1.text="收到新文件:"+ClassMsg.FileName;
break;
}
}按照我上面写的,因为每次接受到数据都新建了一个空白的fs,将接受的数据写到相应文件名的文件中,这样比较灵活,可以同时几个人一起传文件,反正fs中没有残留信息,但是问题也出现了,在接受的过程中,每次新建fs,fs还得从机器上载入未传完的文件,文件超过600K的时候,好像载入的非常慢,载入的数据跟不上服务器向客户端发送数据包的速度,然后后面的数据就丢失了,整份文件只传了600K怎么解决?
{
public String sendkind="";//标识发送状态,如果是"start",表示要准备发送,如果是"sending",说明数据已经开始在发了,如果是"end",说明发完了,start和end时Data是空数据,数据只在sending状态发送 public String FileName = "";//文件名 public byte[] Data;//文件转化成byte[]流,并且切成很多份
}
服务器通过socket不停的发送一个对象ClassMsg到客户端来传送一份文件,
客户端在接受的时候:
分3部写:switch(ClassMsg.sendkind)
{
case start:
{
FileStream fs= File.Create(ClassMsg.FileName);//新建文件名为FileName的文件
break;
}
case sending:
{
FileStream fs=File.OpenWrite(ClassMsg.FileName);//将本地未接受完的文件载入到fs中
fs.Seek(0, SeekOrigin.End);//将该流的当前位值设为0
fs.Write(ClassMsg.Data, 0, ClassMsg.Data.Length);//向文件中写入当前接收的信息
break;
}
case end:
{
this.textbox1.text="收到新文件:"+ClassMsg.FileName;
break;
}
}按照我上面写的,因为每次接受到数据都新建了一个空白的fs,将接受的数据写到相应文件名的文件中,这样比较灵活,可以同时几个人一起传文件,反正fs中没有残留信息,但是问题也出现了,在接受的过程中,每次新建fs,fs还得从机器上载入未传完的文件,文件超过600K的时候,好像载入的非常慢,载入的数据跟不上服务器向客户端发送数据包的速度,然后后面的数据就丢失了,整份文件只传了600K怎么解决?
在start和sending的时候 ,用完都fs.close();的问题依旧
如果我发送600K以下的数据,很顺利,但是超过600K的,数据就丢失了我个人感觉是FileStream fs=File.OpenWrite(...);的速度跟不上,服务器socket过来的速度,socket过来的数据又没在内存中保存进行异步读取,服务器不管客户端读取速度跟不跟的上,反正盲目的发数据包
ThreadPool.QueueUserWorkItem(delegate {调用写文件方法 });
然后在获取流的时候 循环读取 将大于1024的情况也考虑进去!
单机上“开发”就容易这样瞎试。你仔细想一下就能想出一种测试用例,网络差一些,或者某台机器忙一些,不可能盲目匹配上处理速率。更何况你的接收数据的那一端根本没有验证data的偏移地址,而是盲目地放到文件尾去写,这样如何能够检测出丢失的data?实际上真正的传文件,每传送一小块数据都需要确认,发送端没有收到确认则需要重发,重发许多次之后还没有收到确认则传输失败。不要被网上的某些幼稚的socket的“范例”给骗了。你仔细想一想,想好“协议”,不要简单化。