Example #1
0
        public void Sendfile()
        {
            if (!string.IsNullOrEmpty(FilePath))
            {
                double fileLength = new FileInfo(FilePath).Length;
                //先发文件名和文件长度确认信息
                string totalMsg = string.Format("{0}/{1}/", FileName, fileLength);
                SendMsg(totalMsg, 2);
                Thread.Sleep(200);
                byte[] buffer = new byte[SendBufferSize];

                using (FileStream fs = new FileStream(FilePath, FileMode.Open, FileAccess.Read))
                {
                    int    readLength     = 0;
                    bool   firstRead      = true;
                    double sentFileLength = 0;
                    while ((readLength = fs.Read(buffer, 0, buffer.Length)) > 0 && sentFileLength < fileLength)
                    {
                        sentFileLength += readLength;
                        //在第一次发送的字节流上加个前缀1
                        if (firstRead)
                        {
                            byte[] firstBuffer = new byte[readLength + 1];
                            firstBuffer[0] = 1; //告诉机器该发送的字节数组为文件
                            Buffer.BlockCopy(buffer, 0, firstBuffer, 1, readLength);

                            socketClient.Send(firstBuffer, 0, readLength + 1, SocketFlags.None);
                            //Stream.Write(firstBuffer, 0, readLength+1);


                            firstRead = false;

                            continue;
                        }
                        try
                        {
                            //之后发送的均为直接读取的字节流
                            socketClient.Send(buffer, 0, readLength, SocketFlags.None);
                            //Stream.Write(buffer, 0, readLength);
                        }
                        catch
                        {
                        }
                        if (fp != null)
                        {
                            fp.Dispatcher.BeginInvoke(new Action(delegate
                            {
                                fp.Update(sentFileLength / fileLength * 100);
                            }));
                        }
                    }
                    fs.Close();
                    socketClient.Close();
                }
            }
        }
Example #2
0
        private void ServerRecMsg(object socketClientPara)
        {
            Socket socketServer            = socketClientPara as Socket;
            double fileLength              = 0;
            double receivedTotalFilelength = 0;

            while (true)
            {
                int    firstReceived = 0;
                byte[] buffer        = new byte[ReceiveBufferSize];
                try
                {
                    //获取接收的数据,并存入内存缓冲区  返回一个字节数组的长度
                    if (socketServer != null)
                    {
                        firstReceived = socketServer.Receive(buffer);
                    }

                    if (firstReceived > 0)                                                      //接受到的长度大于0 说明有信息或文件传来
                    {
                        if (buffer[0] == 0)                                                     //0为文字信息
                        {
                            strSRecMsg = Encoding.UTF8.GetString(buffer, 1, firstReceived - 1); //真实有用的文本信息要比接收到的少1(标识符)
                        }
                        if (buffer[0] == 2)                                                     //2为文件名字和长度
                        {
                            string    fileNameWithLength = Encoding.UTF8.GetString(buffer, 1, firstReceived - 1);
                            string [] tokens             = fileNameWithLength.Split(new char [] { '/' });
                            strSRecMsg = tokens[0];                  //文件名
                            fileLength = Convert.ToInt64(tokens[1]); //文件长度
                        }
                        if (buffer[0] == 1)                          //1为文件
                        {
                            //string fileNameSuffix = strSRecMsg.Substring(strSRecMsg.LastIndexOf('.')); //文件后缀
                            string savePath = FilePath; //获取文件的全路径
                                                        //保存文件
                            int received = 0;
                            receivedTotalFilelength = 0;
                            bool firstWrite = true;
                            using (FileStream fs = new FileStream(savePath, FileMode.Create, FileAccess.Write))
                            {
                                while (receivedTotalFilelength < fileLength) //之后收到的文件字节数组
                                {
                                    if (firstWrite)
                                    {
                                        fs.Write(buffer, 1, firstReceived - 1); //第一次收到的文件字节数组 需要移除标识符1 后写入文件
                                        fs.Flush();

                                        receivedTotalFilelength += firstReceived - 1;

                                        firstWrite = false;

                                        continue;
                                    }
                                    received = socketServer.Receive(buffer); //之后每次收到的文件字节数组 可以直接写入文件
                                    fs.Write(buffer, 0, received);
                                    fs.Flush();

                                    receivedTotalFilelength += received;

                                    try
                                    {
                                        if (fp != null)
                                        {
                                            fp.Dispatcher.BeginInvoke(new Action(delegate
                                            {
                                                fp.Update(receivedTotalFilelength / fileLength * 100);
                                            }));
                                        }
                                    }
                                    catch { }
                                }
                                Finish = true;
                                fs.Close();
                                socketWatch.Close();
                                FileRecv.ServiceFlag = false;
                                threadWatch.Abort();
                            }

                            string fName = savePath.Substring(savePath.LastIndexOf("\\") + 1); //文件名 不带路径
                            string fPath = savePath.Substring(0, savePath.LastIndexOf("\\"));  //文件路径 不带文件名
                        }
                    }
                    if (receivedTotalFilelength == fileLength)
                    {
                        socketWatch.Close();
                        ServiceFlag = false;
                        threadWatch.Abort();
                    }
                }
                catch
                {
                    break;
                }
            }
        }