procedure TMainC2Form.SendImageData(Sender: Tobject);
var FileStream : TFileStream;
var FileLength, i : integer;
begin
lbStatus.Caption := '파일을 서버로 전송 중...';
SendFileName := 'C:test.jpg';
if FileExists(SendFileName) then // 파일이 존재하면
begin
FileStream := TFileStream.Create(SendFileName,fmOpenRead);
FileLength := FileStream.Size;
if SendFileName <> '' then
begin
ClientSocket2.Socket.SendText(SendFileName);
sleep(100);
ClientSocket2.Active := False;
end;
//********************************
if FileLength > 0 then
begin
ClientSocket3.Active := True;
if ClientSocket3.Active then
begin
lbStatus.Caption := '파일을 서버로 전송 중...!!!';
ClientSocket3.Socket.SendBuf(Filelength,SizeOf(FileLength));
ClientSocket3.Socket.SendStream(FileStream);
end;
ClientSocket3.Active := False;
end;
ClientSocket2.Active := False;
end
else // 파일이 없으면
begin
lbStatus.Caption := '파일이 존재하지 않습니다.';
Exit;
end;
end;
procedure TMainC2Form.Button2Click(Sender: TObject);
begin
ClientSocket2.Active := true
end;
파일전송은 돼나 접속시간이 너무 오래걸리고 클라이언트 소켓 Disconnect 이벤트에서 전송완료가 되었는데 서버에서는 한참뒤에 쓰레드가 종료됩니다.
문제점1. 서버에 화일전송이 너무느리다.
문제점2. 클라이언트의 Disconnect 이벤트에서 종료를 알려왔는데 서버에서는 한참뒤에 쓰레드가 종료됩니다.
좋은 해결방법있으시면 한 수 가르쳐 주십시요.
소켓 connection과 disconnection 이 늦는 것은, 소켓에서 파일을 통채로 보내느라 바쁘기 때문인것 같네요.
보기에 로컬네트웍에서만 테스트 하는것 같군요. 인터넷 환경에서 하면 좀더 많이 버벅거릴 겁니다. 컴퓨터가 죽을지도 모르죠.
소켓이 일정 메모리(버퍼 메모리) 를 사용해서 보낼 데이터는 버퍼에 쓰고 NIC를 통해서 보내고 NIC는 받은 데이터를 버퍼에 쓰기에 소켓은 버퍼를 읽어서 받은 데이터를 확인합니다.
NIC(Network Interface Card, Lan Card)이 그렇게 작동하고 Internet 프로토콜이 그렇게 설계되었으니, 위와 같은 결과가 나오는 것이 당연합니다.
eDonkey 에서 하듯 데이터를 작게 자르고 전송후 받는 쪽에서 합쳐서 쓰는식으로 해야 합니다. 또한 서버단은 분산 환경이어야 겠죠.
근래에 들어 "대용량 데이터 전송 시스템" 을 하는 분들이 자주 보입니다. 저도 그런 일을 하는 회사에 면접본적도 있고요. 아직 인터넷 환경에서 소프트웨어적으로 성공한 예가 없는 것으로 압니다. 그만큼 아주 어렵습니다.
건투를 빕니다.
즐푸하세여..
타락천사..