코드를 게시하지 않았으므로 "내 방식"으로 코드 부분을 작성 하겠지만이 부분을 읽은 후에는 약간의 이해가 있어야합니다.
먼저 양쪽 (클라이언트 및 서버)에서 보내는 데이터를 설명하는 통합 프로토콜을 적용해야합니다. 예 수 :
이
[3Bytes - ASCII 확장] [4 바이트가 - lengthOfTheFile] [XBytes이 - 된 FileContents]
이 그런 다음 보낸 당신이 먼저 읽기 수단 (3) 프로토콜에 따라 데이터를 수신 할 수 있습니다 바이트가 어떤 포맷 파일을 가지고 있는지를 결정하면, 당신은 기본적으로 얼마나 큰 파일이 incomming인지를 알려주는 4 바이트를 읽는다. 마지막으로 내용을 읽고 파일에 직접 써야합니다. 예를 보낸 사람은 다음과 같이 수 :
보낸 사람 부분에
byte[] extensionBuffer = new byte[3];
if(3 != networkStream.Read(extensionBuffer, 0, 3))
return;
string extension = Encoding.ASCII.GetString(extensionBuffer);
byte[] lengthBuffer = new byte[sizeof(int)];
if(sizeof(int) != networkStream.Read(lengthBuffer, 0, 3))
return;
int length = BitConverter.ToInt32(lengthBuffer, 0);
int recv = 0;
using (FileStream stream = File.Create(nameOfTheFile + "." + extension))
{
byte @byte = 0x00;
while((@byte = (byte)networkStream.ReadByte()) != 0x00)
{
stream.WriteByte(@byte);
recv++;
}
stream.Flush();
}
그런 다음 파일 스트림을 열고 파일 확장자를 읽고 스트림의 길이를 얻을 후 클라이언트로 스트림 길이를 보내고 각 바이트를 "리디렉션"할 수 있습니다 FileStream
에서 networkStream
으로
FileInfo meFile = //.. get the file
byte[] extBytes = Encoding.ASCII.GetBytes(meFile.Extension);
using(FileStream stream = meFile.OpenRead())
{
networkStream.Write(extBytes, 0, extBytes.Length);
networkStream.Write(BitConverter.GetBytes(stream.BaseStream.Length));
byte @byte = 0x00;
while (stream.Position < stream.BaseStream.Length)
{
networkStream.WriteByte((byte)stream.ReadByte());
}
}
이 방식은 구현하기가 매우 용이하고 서로 다른 파일 형식을 보내려면 큰 변화를 필요로하지 않는다 :이 같은 것을 볼 수 있습니다. 일부 유효성 검사기가 부족하지만이 기능이 필요하지 않다고 생각합니다.
보내는 소켓은 먼저 콘텐츠의 크기를 보내야합니다. 수신 한 소켓은 콘텐츠를 수신 할 바이트 수를 알 수 있습니다. 내용을받은 후에는 파일 형식에 관계없이 바이트를 저장하면됩니다. 송신자는 파일 형식을 쉽게 보낼 수 있습니다. 형식을 찾는 방법을 묻는다면 내용에 패턴 일치를 수행하여 특정 파일 형식과 일치하는지 확인해야합니다. – Bauss