소켓 프로그래밍 C# (.NET)에서 직접 노력하고 있습니다. codeproject에서 몇 가지 예제를 언급했지만 파일 전송은 항상 불완전한 데이터를 보냅니다.소켓 파일 전송 C#에서 불완전한 파일 보내기
아주 작은 크기의 데이터는 1kB처럼 잘 작동합니다. 그러나 큰 파일은 불완전한 이미지, 특히 이미지가 전송됩니다.
내 클라이언트 코드는 서버에 파일을 보냅니다. clientData는 파일의 바이너리를 저장합니다.
byte[] fileData = File.ReadAllBytes(filePath + fileName);
byte[] clientData = new byte[4 + fileNameByte.Length + fileData.Length];
byte[] fileNameLen = BitConverter.GetBytes(fileNameByte.Length);
fileNameLen.CopyTo(clientData, 0);
fileNameByte.CopyTo(clientData, 4);
fileData.CopyTo(clientData, 4 + fileNameByte.Length);
curMsg = "Connection to server ...";
clientSock.Connect(ipEnd);
int count;
curMsg = "File sending...";
count = clientSock.Send(clientData);
MessageBox.Show(count+" "+clientData.Length);
curMsg = "Disconnecting...";
clientSock.Close();
여기 동안 파일을 수신하는 서버에 대한 내 코드입니다.
sock.Listen(100);
curMsg = "Running and waiting to receive file.";
Socket clientSock = sock.Accept();
byte[] clientData = new byte[1024 * 5000];
int receivedBytesLen = clientSock.Receive(clientData);
curMsg = "Receiving data...";
int fileNameLen = BitConverter.ToInt32(clientData, 0);
string fileName = Encoding.ASCII.GetString(clientData, 4, fileNameLen);
BinaryWriter bWrite = new BinaryWriter(File.Open(receivedPath +"/"+ fileName, FileMode.Append)); ;
bWrite.Write(clientData, 4 + fileNameLen, receivedBytesLen - 4 - fileNameLen);
curMsg = "Saving file...";
bWrite.Close();
clientSock.Close();
재미있는 점은 클라이언트에서 '보내기'에서 중단 점을 설정하면 파일이 올바르게 전송된다는 것입니다. 내가 수신 바이트가 클라이언트에서 전송 된 바이트보다 낮은 동안 내가 중단 점을 사용할 때 양끝에서 바이트 수와 전송 바이트가 일치하는 것을 관찰하고 있습니다.
내가 뭘 잘못하고 있니?
데이터를 청크 단위로 보내려면 작성한 코드를 업로드 할 수 있습니까? – AndroidLearner
사용중인 Close()의 오버로드는 "완료"로 보내기/받기를 기다리지 않고 시간 초과가있는 오버로드를 사용해야하므로 나가는 스트림을 "제거"할 시간이 있습니다. –