大家后。最近刚刚开始学C#网络编程,有很多地方不明白。希望大家指教。
最近做一个软件实习,要求是做一个C/S交互平台,只要能互发信息,传送文件就好了,写传送文件的代码的时候,出现了点问题。希望大家看看。客户端:if (Encoding.ASCII.GetString(bytes, 0, bytesRead) == "accepted")        //准备工作成功,开始传输文件
                        {
                            Console.WriteLine("Server accepted! File passing begin!");                            FileStream fstream = new FileStream("e:\\我的文档\\Visual Studio 2008\\Projects\\Client\\Client\\FileToSend\\" + input, FileMode.Open, FileAccess.Read);                            byte[] buff = new byte[1024];
                            int len = 0;
                            while ((len = fstream.Read(buff, 0, 1024)) != 0)
                            {
                                Console.WriteLine("len = " + len.ToString());
                                fstream.Read(buff, 0, 1024);
                                client.Client.Send(buff, 0, len, SocketFlags.None);
                            }                            client.Client.Send(Encoding.Default.GetBytes("END"));                            Console.WriteLine("Send finished !");                        }这段代码测试过,应该没有问题。
下面是服务器端的代码,问题就出在这里。FileStream fstream = new FileStream("e:\\我的文档\\Visual Studio 2008\\Projects\\Server\\Server\\FileSave\\" + filename, FileMode.OpenOrCreate, FileAccess.ReadWrite);
                        bytes = new byte[1024];
                        int len = 1;
                        Console.WriteLine("Begin to receive !");
                        while (len != 0)
                        {
                            Console.WriteLine("len = " + len.ToString());
                            len = client.Client.Receive(bytes);
                            if (Encoding.Default.GetString(bytes) == "END")
                            { break; }
                            fstream.Write(bytes, 0, len);
                        }
            fstream.Flush();                        Console.WriteLine("Recevie finished !");
这段代码的执行结果是,服务器端一直无法执行到最后一句代码,文件已被写入,但是写入不全。只写了大部分的文件内容。还有一部分无故失踪。
请大家帮忙看看那里错了。拜托!

解决方案 »

  1.   

    while ((len = fstream.Read(buff, 0, 1024)) != 0)
    {
        Console.WriteLine("len = " + len.ToString());
        fstream.Read(buff, 0, 1024);
        client.Client.Send(buff, 0, len, SocketFlags.None);
    }这段代码出了问题while ((len = fstream.Read(buff, 0, 1024)) != 0)
    {
         Console.WriteLine("len = " + len.ToString());
         //fstream.Read(buff, 0, 1024);
         client.Client.Send(buff, 0, len, SocketFlags.None);
    }
      

  2.   


                            while (len != 0)//为什么这个无法起作用?
                            {
                                Console.WriteLine("len = " + len.ToString());
                                len = client.Client.Receive(bytes);//没有数据到达,这里阻塞了,有数据到达,len就不会为0。
                                if (Encoding.Default.GetString(bytes) == "END")//这个为什么会失效?你假设了对方发送的“END”是一个完整的单独的包,但这几乎是不可能的。
                                { break; }
                                fstream.Write(bytes, 0, len);
                            }
                fstream.Flush();
      

  3.   

    从我在设计网络程序时的调试经历来看,一次发送的包有可能分多次到达,多次发送的包也有可能搅到一起一次到达。所以,后来我通常是使用NetworkStream,可以检测是否有数据到达,一定时间内没有数据到达,判定为结束。如果要查找结束标志,从接收的数据末尾倒过来找。我觉得,要是Socket的Receive方法有超时参数的话,就能够比较符合我的理想了。