Example #1
0
        public void ReceiveFile()
        {
            try
            {
                ReceivedFileInfo FileInfo = new ReceivedFileInfo();

                byte[] fileInfoByte = new byte[INFO_BUFFER];
                int    firstTimeIn = 0, infoEndPoint = 0, tryTime = 0;
                bool   mutiReceiveFlag = false;
                while (true)
                {
                    Connection.Read(fileInfoByte, firstTimeIn, (int)(INFO_BUFFER - firstTimeIn));

                    string fileInfoStr = Encoding.UTF8.GetString(fileInfoByte);
                    //Console.WriteLine("receiveinfo:" + fileInfoStr);
                    FileInfo = ReadFileInfoFromByte(fileInfoByte, out infoEndPoint);
                    fileSize = FileInfo.FileSize;

                    for (int i = infoEndPoint + 1; i < INFO_BUFFER; i++)
                    {
                        if (fileInfoByte[i] == 0)
                        {
                            break;
                        }
                        firstTimeIn++;
                    }
                    if ((fileSize <= 0 && firstTimeIn > INFO_BUFFER))
                    {
                        ReceivingFileFinished(ReceiveResult.CannotReceived, "文件标头解析失败", "连接失败");
                        return;
                    }
                    else if (fileSize <= 0 || tryTime++ > 3)
                    {
                        ReceivingFileFinished(ReceiveResult.CannotReceived, "文件长度为0", "连接失败");
                        return;
                    }
                    else if (fileSize > 0)
                    {
                        break;
                    }
                    firstTimeIn++;
                    mutiReceiveFlag = true;
                }
                if (mutiReceiveFlag)
                {
                    firstTimeIn = 0;
                    for (int i = infoEndPoint + 1; i < INFO_BUFFER; i++)
                    {
                        if (fileInfoByte[i] == 0)
                        {
                            break;
                        }
                        firstTimeIn++;
                    }
                }

                using (FileStream fstream = new FileStream(ReceiveSaveLocation + @"\" + FileInfo.FileName, FileMode.Create, FileAccess.ReadWrite))
                {
                    byte[] buff     = new byte[RECEIVE_BUFFER];
                    int    buffered = 0;

                    ReceivingFileStarted(FileInfo.FileName);


                    if (!Connection.CanRead)
                    {
                        ReceivingFileFinished(ReceiveResult.CannotReceived, "连接无法读取", "连接失效");
                        return;
                    }

                    fstream.Write(fileInfoByte, infoEndPoint + 1, firstTimeIn);
                    totalReceived += firstTimeIn;
                    int thisTimeBuffer = FileInfo.FileSize - totalReceived > buff.Length ? buff.Length : (int)(FileInfo.FileSize - totalReceived);
                    if (thisTimeBuffer > 0)
                    {
                        while ((buffered = Connection.Read(buff, 0, thisTimeBuffer)) > 0)
                        {
                            if (CancelFileReceiving)
                            {
                                ReceivingFileFinished(ReceiveResult.Cancelled, "文件接收被取消", "连接失效");
                                return;
                            }
                            fstream.Write(buff, 0, buffered);
                            totalReceived += buffered;
                            if (totalReceived >= FileInfo.FileSize)
                            {
                                break;
                            }
                        }
                    }
                    if (totalReceived > FileInfo.FileSize)
                    {
                        Console.WriteLine("超出预期数据量");
                    }
                    if (totalReceived < FileInfo.FileSize)
                    {
                        ReceivingFileFinished(ReceiveResult.CannotReceived, "接收到的数据不完整", "连接错误");
                        return;
                    }
                }
                //准备开始下次传输的等待
                var data = Encoding.UTF8.GetBytes("#####");
                Connection.Write(data, 0, 5);
                totalReceived = 0;
                ReceivingFileFinished(ReceiveResult.Completed, "file:" + FileInfo.FileName + ",size:" + FileInfo.FileSize, "接收完成");
            }
            catch (IOException ex)
            {
                if (ex.InnerException is Win32Exception errcode && errcode.ErrorCode == 10054)
                {
                    ReceivingFileFinished(ReceiveResult.CannotReceived, "当前存在其他用户", "文件操作失败");
                }
Example #2
0
        private async void ReceiveFile()
        {
            try
            {
                ReceiveResult returnReceiveResult = ReceiveResult.CannotReceived;
                string        returnMessage       = string.Empty;
                string        returnMessageTitle  = string.Empty;

                byte[] fileInfoByte = new byte[INFO_BUFFER];

                await Task.Run(async() =>
                {
                    await NetworkStream.ReadAsync(fileInfoByte, 0, (int)INFO_BUFFER);
                });

                ReceivedFileInfo FileInfo = ReadFileInfoFromByte(fileInfoByte);
                fileSize = FileInfo.FileSize;

                string questionMessageBody  = Translator.GetStringFromResource(MessageCodes.ReceiverAskForReceiveFile.ToString(), FileInfo.FileName, FileInfo.FileSize.formatSize());
                string questionMessageTitle = Translator.GetStringFromResource(MessageCodes.ReceiverAskForReceiveFileTitle.ToString());

                if (MessageBox.Show(questionMessageBody, questionMessageTitle, MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No)
                {
                    returnReceiveResult = ReceiveResult.FileIgnoredByUser;
                    returnMessage       = Translator.GetStringFromResource(MessageCodes.ReceiverFileRejectedByUser.ToString());
                    returnMessageTitle  = Translator.GetStringFromResource(MessageCodes.ReceiverFileRejectedByUserTitle.ToString());

                    ReceivingFileFinished(returnReceiveResult, returnMessage, returnMessageTitle);

                    return;
                }

                using (FileStream fstream = new FileStream(ReceiveSaveLocation + @"\" + FileInfo.FileName, FileMode.Create, FileAccess.ReadWrite))
                {
                    byte[] buff     = new byte[RECEIVE_BUFFER];
                    int    buffered = 0;

                    ReceivingFileStarted();

                    await Task.Run(async() =>
                    {
                        if (!NetworkStream.CanRead)
                        {
                            returnReceiveResult = ReceiveResult.CannotReceived;
                            returnMessage       = Translator.GetStringFromResource(MessageCodes.ReceiverCouldntReadStream.ToString());
                            returnMessageTitle  = Translator.GetStringFromResource(MessageCodes.ReceiverCouldntReadStreamTitle.ToString());

                            return;
                        }
                        while ((buffered = await NetworkStream.ReadAsync(buff, 0, buff.Length)) > 0)
                        {
                            if (CancelFileReceiving)
                            {
                                returnReceiveResult = ReceiveResult.Cancelled;
                                returnMessage       = Translator.GetStringFromResource(MessageCodes.ReceiverCancelledByUser.ToString());
                                returnMessageTitle  = Translator.GetStringFromResource(MessageCodes.ReceiverCancelledByUserTitle.ToString());

                                return;
                            }
                            await fstream.WriteAsync(buff, 0, buffered);
                            totalReceived += buffered;
                        }

                        if (totalReceived < FileInfo.FileSize)
                        {
                            returnReceiveResult = ReceiveResult.CannotReceived;
                            returnMessage       = Translator.GetStringFromResource(MessageCodes.ReceiverFailed.ToString());
                            returnMessageTitle  = Translator.GetStringFromResource(MessageCodes.ReceiverFailedTitle.ToString());

                            return;
                        }
                        returnReceiveResult = ReceiveResult.Completed;
                        returnMessage       = Translator.GetStringFromResource(MessageCodes.ReceiverCompleted.ToString());
                        returnMessageTitle  = Translator.GetStringFromResource(MessageCodes.ReceiverCompletedTitle.ToString());
                    });

                    ReceivingFileFinished(returnReceiveResult, returnMessage, returnMessageTitle);
                }
            }
            catch (IOException ex)
            {
                var errcode = ex.InnerException as Win32Exception;

                if (errcode != null && errcode.ErrorCode == 10054)
                {
                    ReceivingFileFinished(ReceiveResult.CannotReceived, Translator.GetStringFromResource(MessageCodes.ReceiverIOException10054.ToString()), Translator.GetStringFromResource(MessageCodes.ReceiverIOException10054Title.ToString()));
                }
                else
                {
                    ReceivingFileFinished(ReceiveResult.CannotReceived, Translator.GetStringFromResource(MessageCodes.ReceiverIOException.ToString()), Translator.GetStringFromResource(MessageCodes.ReceiverIOExceptionTitle.ToString()));
                }
            }
            catch (Exception exception)
            {
                ReceivingFileFinished(ReceiveResult.CannotReceived, Translator.GetStringFromResource(MessageCodes.ReceiverException.ToString(), exception.Message), Translator.GetStringFromResource(MessageCodes.ReceiverExceptionTitle.ToString()));
            }
            finally
            {
                Dispose();
            }
        }