日期:2014-05-17  浏览次数:20857 次

局域网传送文件问题 、
用sockte tcp协议局域网传送文件,为什么会出现文件损坏的问题:传送图片打不开,传送软件显示损坏。
帮忙解决一下,谢谢。
这是我发送文件的代码:
  byte[] buff1 = new byte[1024];
  FileStream fs = new FileStream(path, FileMode.Open);
  int filesize = (int)fs.Length;
  buff1 = System.Text.Encoding.BigEndianUnicode.GetBytes(filesize + "-" + "file" + ":" + filename + "。");/ /获取文件名,及文件大小
  use.Send(buff1, buff1.Length, SocketFlags.None);//发送文件名 及文件的大小
  byte[] buff = new byte[1024];
  prbSend.Maximum = (int)Math.Ceiling((double)filesize / (double)1024);//设置进度条最大值
  int dq = 0;
  int yfs = 0;
  while ((dq=fs.Read(buff,0,1024))!=0)//循环读取
   {
      fs.Flush();
      use.Send(buff,dq, SocketFlags.None);
      prbSend.Value += 1;
      yfs += dq;
    }
     fs.Close();
     use.Close();
     contr(false);
     prbSend.Value = 0;
     MessageBox.Show("发送成功");
这是接收的代码:
   int filesize = Convert.ToInt32(m.Substring(0, m.IndexOf("-")));//文件大小
   int q=m.IndexOf(':')+1;
   int j = m.IndexOf('。') - 1 - filesize.ToString().Length - 5;
   filename = m.Substring(q,j );//文件名
   FileStream fs = new FileStream("F:\\" + filename, FileMode.Create);
   fs.Close();
   FileStream write = new FileStream("F:\\" + filename, FileMode.Append, FileAccess.Write);
   byte[] buff1 = new byte[1024];
    int yjs = 0;
    int js = 0;
    while ((yjs=use.Receive(buff1))!=0)//循环接收
     {
        write.Write(buff1,0,yjs);
        write.Flush();
        js += yjs;
     }
     write.Close();
tcp file

------解决方案--------------------
找一个16进制文件编辑器(winhex or ultraedit),看看原始文件和传输后的文件有什么不同,然后分析你的传输有什么错误。
------解决方案--------------------
引用:
……
int filesize = Convert.ToInt32(m.Substring(0, m.IndexOf("-")));//文件大小

接收代码可能有错误。

在拿文件长度filesize的时候,socket已经接收过一次了。
很有可能,你收到的不仅仅是m,还包括一部分文件。

由于没有校验实际收到的文件是否和文件长度相符,你没有发现实际收到的文件比原文件小。