블로킹상태로 파일을 전송하는 것은 전송하고자하는 파일에 대한 자료를 알수가 없어서 논-블로킹으로 파일을 전송을 할려고 합니다...
파일을 전송하다가 잘 안되서요....
보내는 측은 잘되는데 받는 곳에서 23k이상을 받을때 문제가 발생을 합니다...
20K정도는 잘가는데....
소스를 첨부 합니다....
미리 감사드립니다.....
//////////////파일 전송하는 부분///////
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
i, AllFileLength, FileLength : Integer;
s1, sTag, sFile : String;
FileStream : TFileStream;
begin
s1 := Socket.ReceiveText;
sTag := Copy(s1,1,Pos(';',s1));
Delete(s1,1,Pos(';',s1));
If sTag = 'Mess;' then begin
lb2.Items.Add(Socket.RemoteAddress + s1);
For i := 0 to ServerSocket1.Socket.ActiveConnections - 1 do begin
Serversocket1.Socket.Connections[i].SendText(sTag+s1);
end;
end Else If sTag = 'File;' then begin
lb2.Items.Add('파일 전송 시작');
lb2.Items.Add('파일명 : ' + Edit1.Text);
ServerSocket1.Socket.Connections[0].SendText(sTag);
sFile := Edit1.Text;
FileStream := TFileStream.Create (sFile, fmOpenRead or fmShareDenyWrite);
AllFileLength := FileStream.Size;
FileLength := 0;
While True do begin
Try
FileStream.ReadBuffer(Buffer, SizeOf(Buffer));
Except on EReadError do begin
FileStream.Free;
Break;
end; end;
ServerSocket1.Socket.Connections[0].SendBuf(Buffer, SizeOf(Buffer));
FileLength := FileStream.Position;
end;
lb2.Items.Add('파일 전송 끝');
end;
end;
/////////////////////////////////////////////////
//////////////////////파일 받는 부분///////////////////////////
procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
var
i : Integer;
s1, sTag, sFile : String;
Stream : TMemoryStream;
nReceived : Integer;
Time1 : Cardinal;
begin
Socket.ReceiveBuf(Buffer,5);
sTag := Copy(Buffer,1,5);
If sTag = 'Mess;' then begin
s1 := Socket.ReceiveText;
Delete(s1,1,Pos(';',s1));
lb1.Items.Add(s1);
end Else If sTag = 'File;' then begin
Stream := TMemoryStream.Create;
Screen.Cursor := crHourglass;
try
while True do begin
nReceived := Socket.ReceiveBuf (Buffer, sizeof (Buffer));
if nReceived <= 0 then Break
else Stream.Write (Buffer, nReceived);
Time1 := GetTickCount;
while GetTickCount - Time1 < 200 do;
end;
Stream.Position := 0;
Stream.SaveToFile(Edit4.Text);
finally
Stream.Free;
Screen.Cursor := crDefault;
end;
end;
end;
/////////////////////////////////////////////////
서버측에서 화일의 일부분을 보내고 클라이언트에서 그것을 받았을때
잘 받았다는 내용을 다시 서버에 보내서 확인을 하고 다시 서버에서
다음 내용을 보내야합니다...
그 이유는요...
서버에서의 처리속도와 클라이언트에서의 처리속도가 다를 경우(거의 다름)
데이터가 잘리는 현상이 발생하기때문입니다...
예를 들어 서버에서는 초당 1메가를 전송했는데 클라이언트는 느려서 초당 500k
정도밖에 읽어내지를 못하면 나머지는 잘리는 거죠...
순전히 제 경험담입니다...
그럼 도움이 되셨으길...