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, "当前存在其他用户", "文件操作失败"); }
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(); } }