当前位置: 代码迷 >> C# >> C#socket传输文件有关问题
  详细解决方案

C#socket传输文件有关问题

热度:65   发布时间:2016-05-05 04:36:50.0
C#socket传输文件问题
  FileStream SendFile = new FileStream(@"H:\迅雷下载\adblockpluschrome-1.8.10.1346.crx", FileMode.Open, FileAccess.Read);
                //尝试读取,发送
                try
                {
                    int fRead = 0;
                    int tRead = 0;
                    byte[] buf = new byte[BufSize];
                    do
                    {
                        fRead = SendFile.Read(buf, 0, buf.Length);
                        RecSoc.Send(buf, fRead, SocketFlags.None);
                        tRead += fRead;
                    } while (fRead > 0);
                    Console.WriteLine("The length of buffer is {0}!", tRead);

Server端的。
           FileStream RecFile = new FileStream(@"F:\adblockpluschrome-1.8.10.1346.crx", FileMode.OpenOrCreate);
            int fRead;
            long tWrite = 0;
            try
            {
                byte[] buf = new byte[BufSize];
                fRead = client.Receive(buf);
                while(fRead > 0)
                {
                    RecFile.Write(buf, 0, fRead);
                    tWrite += fRead;
                    fRead = client.Receive(buf);
                    Console.WriteLine("Received {0} bytes!", tWrite);
                } 
            }

Client端的
------解决思路----------------------
为什么两端一个是do,while,一个是while
断点跟,看到底哪端有问题啊,不要靠猜测
------解决思路----------------------

tWrite += fRead;
这句话明显有问题
既然while外面read一次,while里面循环read
那么tWrite += fRead;这个代码也应该出现2次才对
都应该放到read后面

否则最后一次接收到的,根本没有累加上去
而且你看文件本身大小确实不一样吗,不是你自己计算的大小不一样而已吗
------解决思路----------------------
RecFile.Write之后
执行一下RecFile.Flush
------解决思路----------------------
估计是服务端已经把文件发完,关闭连接了
你客户端断点,停下了,可是服务端没停啊
------解决思路----------------------
你应该确保关闭连接由客户端来操作,服务端不要随便关闭连接,哪怕文件已经发完了
------解决思路----------------------
在catch里设置断点,看是不是抛错误了
------解决思路----------------------
RecSoc.Send之后也没加flush...
最好还是找个完整的例子参考一下,不要全靠拍头

这东西你自己做了玩还行,真正想用,还差的远,会遇到很多问题
------解决思路----------------------

------解决思路----------------------
什么叫不用flush的版本
write之后就必然要flush
你可以自己封装一个方法,把flush写里面,就不用每次再次调用flush了
  相关解决方案