C#Socket(tcp)异步批量发送文件问题 15
privatevoidSendFile(Sockethandler){intfilesCount=dgvUpload.Rows.Count;//文件数量stringcou...
private void SendFile(Socket handler)
{
int filesCount = dgvUpload.Rows.Count;//文件数量
string count = filesCount.ToString() + "<&>";
byte[] bytefilesCount = Encoding.UTF8.GetBytes(count);
handler.BeginSend(bytefilesCount, 0, bytefilesCount.Length, 0, new AsyncCallback(SendFileCallback), handler);
for (int i = 0; i < filesCount; i++)
{
string path = dgvUpload.Rows[i].Cells["filePath"].Value.ToString();//文件路径
byte[] bytePath = Encoding.UTF8.GetBytes(path);
handler.BeginSend(bytePath, 0, bytePath.Length, 0, new AsyncCallback(SendFileCallback), handler);
string fileName = dgvUpload.Rows[i].Cells["fileName"].Value.ToString();//文件名;
byte[] byteFileName = Encoding.UTF8.GetBytes(fileName);
handler.BeginSend(byteFileName, 0, byteFileName.Length, 0, new AsyncCallback(SendFileCallback), handler);
FileStream fs = new FileStream(path, FileMode.Open);//读取文件
long length = fs.Length; //文件长度
byte[] byteLength = Encoding.UTF8.GetBytes(length.ToString());
byte[] fileblock = new byte[1024];//每次发送一个1KB的包,如果文件较大,则会拆分为多个包
while (fs.Read(fileblock, 0, 1024) != 0)
{
handler.BeginSend(fileblock, 0, fileblock.Length, 0, new AsyncCallback(SendFileCallback), handler);
}
}
}
发送代码我贴出来了,本人新手,有几点疑问。
我每次调用异步发送方法发送的数据后,在异步接收时顺序是否出会出现问题?
我的思路是先发送要发送文件的数量,然后再循环的异步接收,我总觉得在异步接收时候文件数据时组包会出现问题。
本人新手组包思路应该是什么样的?网上给出的思路我也看了。有朋友可以根据我的思路以及代码提出修改意见吗?
非常感谢! 展开
{
int filesCount = dgvUpload.Rows.Count;//文件数量
string count = filesCount.ToString() + "<&>";
byte[] bytefilesCount = Encoding.UTF8.GetBytes(count);
handler.BeginSend(bytefilesCount, 0, bytefilesCount.Length, 0, new AsyncCallback(SendFileCallback), handler);
for (int i = 0; i < filesCount; i++)
{
string path = dgvUpload.Rows[i].Cells["filePath"].Value.ToString();//文件路径
byte[] bytePath = Encoding.UTF8.GetBytes(path);
handler.BeginSend(bytePath, 0, bytePath.Length, 0, new AsyncCallback(SendFileCallback), handler);
string fileName = dgvUpload.Rows[i].Cells["fileName"].Value.ToString();//文件名;
byte[] byteFileName = Encoding.UTF8.GetBytes(fileName);
handler.BeginSend(byteFileName, 0, byteFileName.Length, 0, new AsyncCallback(SendFileCallback), handler);
FileStream fs = new FileStream(path, FileMode.Open);//读取文件
long length = fs.Length; //文件长度
byte[] byteLength = Encoding.UTF8.GetBytes(length.ToString());
byte[] fileblock = new byte[1024];//每次发送一个1KB的包,如果文件较大,则会拆分为多个包
while (fs.Read(fileblock, 0, 1024) != 0)
{
handler.BeginSend(fileblock, 0, fileblock.Length, 0, new AsyncCallback(SendFileCallback), handler);
}
}
}
发送代码我贴出来了,本人新手,有几点疑问。
我每次调用异步发送方法发送的数据后,在异步接收时顺序是否出会出现问题?
我的思路是先发送要发送文件的数量,然后再循环的异步接收,我总觉得在异步接收时候文件数据时组包会出现问题。
本人新手组包思路应该是什么样的?网上给出的思路我也看了。有朋友可以根据我的思路以及代码提出修改意见吗?
非常感谢! 展开
1个回答
2015-03-14
展开全部
从ServerB下载文件,分别下载多个文件,
下载结果没有发现错误文件.当开启迅雷下载后没有发现文件错误.
测试文件发送到Server和下载的情况基本差不多,这说明了在网络不好的情况处理发送大数据包似首容易产生错误,但看TCP/IP协议讲解这情况似乎不存在,因为当一个发送数据超过某个值的时候,TCP会划分块进行传输并保证其顺序.但网络不好的情况测试结果接收的数据有错误,但处理的数据大小是正确的,也并没影响整个协议的分解.由于对CP/IP协议、低层和路由处理的不了解,暂没找到具体原因。。。不排除程序存在还没发现的错误,打算给发送的文件数据加上校验再测试一下看情况
下载结果没有发现错误文件.当开启迅雷下载后没有发现文件错误.
测试文件发送到Server和下载的情况基本差不多,这说明了在网络不好的情况处理发送大数据包似首容易产生错误,但看TCP/IP协议讲解这情况似乎不存在,因为当一个发送数据超过某个值的时候,TCP会划分块进行传输并保证其顺序.但网络不好的情况测试结果接收的数据有错误,但处理的数据大小是正确的,也并没影响整个协议的分解.由于对CP/IP协议、低层和路由处理的不了解,暂没找到具体原因。。。不排除程序存在还没发现的错误,打算给发送的文件数据加上校验再测试一下看情况
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询