コード例 #1
0
        public bool SendFile(FileInfo EzoneFile)
        {
            FileStream EzoneStream = EzoneFile.OpenRead();

            PacketSize = 8192;

            //包的数量
            PacketCount = (int)(EzoneStream.Length / ((long)PacketSize));

            //最后一个包的大小
            LastDataPacket = (int)(EzoneStream.Length - ((long)(PacketSize * PacketCount)));
            //指向远程服务端节点

            IPEndPoint clientep = (IPEndPoint)client.RemoteEndPoint;


            //发送[文件名]到客户端
            TransferFiles.SendVarData(client, System.Text.Encoding.Unicode.GetBytes(EzoneFile.Name));

            //发送[包的大小]到客户端
            TransferFiles.SendVarData(client, System.Text.Encoding.Unicode.GetBytes(PacketSize.ToString()));

            //发送[包的总数量]到客户端
            TransferFiles.SendVarData(client, System.Text.Encoding.Unicode.GetBytes(PacketCount.ToString()));

            //发送[最后一个包的大小]到客户端
            TransferFiles.SendVarData(client, System.Text.Encoding.Unicode.GetBytes(LastDataPacket.ToString()));

            bool isCut = false;

            //数据包
            byte[] data = new byte[PacketSize];
            Position = 0;
            //开始循环发送数据包
            for (int i = 0; i < PacketCount; i++)
            {
                //从文件流读取数据并填充数据包
                EzoneStream.Read(data, 0, data.Length);
                //发送数据包
                Position++;
                stopwatch.Reset();
                stopwatch.Start();
                if (TransferFiles.SendVarData(client, data) == 3)
                {
                    isCut = true;
                    return(false);
                }
                stopwatch.Stop();
                if (stopwatch.ElapsedMilliseconds == 0)
                {
                    speed = 0;
                }
                else
                {
                    speed = (1000 * data.Length) / (int)(stopwatch.ElapsedMilliseconds * 1000);
                }
            }

            //如果还有多余的数据包,则应该发送完毕!
            if (LastDataPacket != 0)
            {
                data = new byte[LastDataPacket];
                EzoneStream.Read(data, 0, data.Length);
                TransferFiles.SendVarData(client, data);
            }

            PacketCount = Position = 0;
            //关闭文件流
            EzoneStream.Close();
            return(true);
        }
コード例 #2
0
        public void Create(object clientSocket)
        {
            while (true)
            {
                Socket client = clientSocket as Socket;
                //获得客户端节点对象
                IPEndPoint clientep = (IPEndPoint)client.RemoteEndPoint;

                //获得[文件名]
                string SendFileName = System.Text.Encoding.Unicode.GetString(TransferFiles.ReceiveVarData(client));


                //获得[包的大小]
                string bagSize = System.Text.Encoding.Unicode.GetString(TransferFiles.ReceiveVarData(client));

                //获得[包的总数量]
                bagCount = int.Parse(System.Text.Encoding.Unicode.GetString(TransferFiles.ReceiveVarData(client)));

                //获得[最后一个包的大小]
                string bagLast = System.Text.Encoding.Unicode.GetString(TransferFiles.ReceiveVarData(client));


                string fullPath = Path.Combine(Environment.CurrentDirectory, SendFileName);
                //创建一个新文件
                FileStream MyFileStream = new FileStream(fullPath, FileMode.Create, FileAccess.Write);

                //已发送包的个数
                SendedCount = 0;
                Message temp = new Message("sys", SendFileName + "正在接收!", null);
                FileReceived(temp.ToString());
                while (SendedCount < (bagCount + 1))
                {
                    stopwatch.Reset();
                    stopwatch.Start();
                    byte[] data = TransferFiles.ReceiveVarData(client);
                    stopwatch.Stop();
                    if (stopwatch.ElapsedMilliseconds == 0)
                    {
                        speed = 0;
                    }
                    else
                    {
                        speed = (1000 * data.Length) / (int)(stopwatch.ElapsedMilliseconds * 1000);
                    }
                    if (data.Length == 0)
                    {
                        break;
                    }
                    else
                    {
                        SendedCount++;
                        //将接收到的数据包写入到文件流对象
                        MyFileStream.Write(data, 0, data.Length);

                        //显示已发送包的个数
                    }
                }

                SendedCount = bagCount = 0;
                //关闭文件流
                MyFileStream.Close();
                //关闭套接字
                //client.Close();
                Message temp1 = new Message("sys", SendFileName + "接收完毕!", null);
                FileReceivedFinish(temp1.ToString());
            }
        }