내 목표는 NetworkStream을 사용하여 TCP 연결을 통해 파일을 보내는 것입니다. 먼저 보낼 데이터의 길이를 보낸 다음 파일 스트림과 이진 작성기를 사용하여 바이트 단위로 데이터를 보냅니다.NetworkStream을 통해 보낸 파일이 손상되었습니다. C#
프로세스를 디버깅하는 동안 수신 측에서 파일의 시작 위치에 '0'바이트가 삽입되어있는 것으로 나타났습니다. 예를 들어 기본 파일의 내용 azertyuiop
은 azerty
(4 공백은 uiop
을 대체)으로 수신되어 이미지와 같은 파일이 손상됩니다.
내가 지금까지 가지고 코드 : (BR은 BinaryReader를하고 BW는 BinaryWriter 인 경우)
보낸 사람 :
using (var readStream = new FileStream(fileLocation, FileMode.Open))
{
// Send the data length first
bw.Write(new FileInfo(fileLocation).Length);
bw.Flush();
var buffer = new byte[1];
while (readStream.Read(buffer, 0, 1) > 0)
{
bw.Write(buffer[0]);
bw.Flush();
}
}
수신기 :
// Get data length
var dataLength = br.ReadInt32();
using (var fs = new FileStream(newFileLocation, FileMode.Create))
{
var buffer = new byte[1];
for(int i = 0; i < dataLength; i++)
{
br.Read(buffer, 0, 1);
fs.Write(buffer, 0, 1);
}
}
무엇 오전 누락되었거나 잘못하고 있습니까?
bw.Write(new FileInfo(fileLocation).Length);
...
var dataLength = br.ReadInt32();
Length
속성이 실제로 유형 long
(8 바이트)입니다 :
데이터의 길이를 보내고받는 방법을 보려면이 응답 (https://stackoverflow.com/questions/7099875/sending-messages-and-files-over-networkstream)을보십시오. –
문제는 아니지만 한 번에 한 바이트 씩 읽고 쓰는 것은 매우 비효율적입니다. 더 큰 버퍼와 Read 호출 결과를 사용하여 작성해야하는 내용을 확인하십시오. –
특히 모든 바이트를 버려 두지 마십시오. – pm100