Q&A

  • 소켓을 이용한 파일전송에 대해서....
블로킹상태로 파일을 전송하는 것은 전송하고자하는 파일에 대한 자료를 알수가 없어서 논-블로킹으로 파일을 전송을 할려고 합니다...



파일을 전송하다가 잘 안되서요....

보내는 측은 잘되는데 받는 곳에서 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;

/////////////////////////////////////////////////



3  COMMENTS
  • Profile
    문보석 1999.07.24 20:37
    제 경험으로는요...

    서버측에서 화일의 일부분을 보내고 클라이언트에서 그것을 받았을때

    잘 받았다는 내용을 다시 서버에 보내서 확인을 하고 다시 서버에서

    다음 내용을 보내야합니다...

    그 이유는요...

    서버에서의 처리속도와 클라이언트에서의 처리속도가 다를 경우(거의 다름)

    데이터가 잘리는 현상이 발생하기때문입니다...

    예를 들어 서버에서는 초당 1메가를 전송했는데 클라이언트는 느려서 초당 500k

    정도밖에 읽어내지를 못하면 나머지는 잘리는 거죠...

    순전히 제 경험담입니다...

    그럼 도움이 되셨으길...

  • Profile
    은종범 1999.07.25 21:25
    문보석 께서 말씀하시기를...

    > 제 경험으로는요...

    > 서버측에서 화일의 일부분을 보내고 클라이언트에서 그것을 받았을때

    > 잘 받았다는 내용을 다시 서버에 보내서 확인을 하고 다시 서버에서

    > 다음 내용을 보내야합니다...

    > 그 이유는요...

    > 서버에서의 처리속도와 클라이언트에서의 처리속도가 다를 경우(거의 다름)

    > 데이터가 잘리는 현상이 발생하기때문입니다...

    > 예를 들어 서버에서는 초당 1메가를 전송했는데 클라이언트는 느려서 초당 500k

    > 정도밖에 읽어내지를 못하면 나머지는 잘리는 거죠...

    > 순전히 제 경험담입니다...

    > 그럼 도움이 되셨으길...





    우선 대답에 감사를 들립니다....

    그런데 서버측이나 클라이언트측에서 잘 받았다고 하는 또는 잘 보냈다는 메세지 처리를 인위적으로 할수 가 있나요?...

    아니면 어떤 이벤트가 있는지 갈켜주세요....



    그럼 이만....



  • Profile
    문보석 1999.07.26 21:42
    > 우선 대답에 감사를 들립니다....

    > 그런데 서버측이나 클라이언트측에서 잘 받았다고 하는 또는 잘 보냈다는 메세지 처리를 인위적으로 할수 가 있나요?...

    > 아니면 어떤 이벤트가 있는지 갈켜주세요....

    >

    > 그럼 이만....

    >



    어떤 이벤트가 아니라 인위적으로 해주는 겁니다...

    저는 이렇게 했습니다...

    우선 서버에서 1024개의 내용을 보낸뒤 클라이언트가 받은 내용이 1024개면 스트링으로 '1024'라고 서버에 다시 보냅니다...

    서버는 클라이언트에서 보낸 '1024' 스트링을 인티져로 1024로 바꿈으로써

    클라이언트가 모두다 받았구나하고 아닌것이지요...

    만약 클라이언트에서 1024보다 작은 내용이 리턴해왔다면 중간에서 잘린것이니까

    다시 그내용을 보내야겠지요...

    그럼 안녕히...

    • 구창민
      1999.07.26 04:28
      델파이 초보 께서 말씀하시기를... > 저의 질문이 두리뭉실하셨다구요. 히히 > 다시 보니까 핵심 내용을...
    • 김태균
      1999.07.24 20:17
      음.... 파라미터를 사용해서 저장하면 됩니다. 저는 Query Component를 사용해서 SQL문을 이용해서 작...
    • 정진호
    • 1999.07.24 18:38
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 김태균
      1999.07.24 20:19
      정진호 께서 말씀하시기를... > 초짜거든요. > > Oracle 사용자입니다. > dataset이 Query인 자료...
    • 효석
    • 1999.07.24 07:23
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 은종범
    • 1999.07.24 06:57
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 문보석
      1999.07.24 20:37
      제 경험으로는요... 서버측에서 화일의 일부분을 보내고 클라이언트에서 그것을 받았을때 잘 받았다는 내...
    • 은종범
      1999.07.25 21:25
      문보석 께서 말씀하시기를... > 제 경험으로는요... > 서버측에서 화일의 일부분을 보내고 클라이언트에...
    • 문보석
      1999.07.26 21:42
      > 우선 대답에 감사를 들립니다.... > 그런데 서버측이나 클라이언트측에서 잘 받았다고 하는 또는 잘 보...
    • 강경중
    • 1999.07.24 06:00
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 김종환
      1999.07.24 21:18
      강경중 께서 말씀하시기를... > 한델에서 배우기만 하는 초보 델피언 입니다.... > OutlookExpress는 새...
    • 김태균
      1999.07.24 20:26
      간단한 로그인을 체크하는 프로그램입니다. 정리를 안한거니까 좀 수정하고 해서 사용하면 쓸만 할겁니다....
    • 양효비
      1999.07.24 20:58
      안녕 하세요. 흠..그럼 컴포넌트는 어떤식으로 해야하는지 ㅠ.ㅠ 히궁.. 까마득 합니다용. 어떤컴포넌...
    • 김태균
      1999.07.24 21:07
      제가 보내드린 소스에 있는 DM은 Datamodule이고요... 필요한 컴포넌트들은 Query, Edit 2개, Button1개...
    • 양효비
      1999.07.24 21:54
      흑흑 정말 죄송해요. 초보는 역시 초보인가 붑니다 ㅠ.ㅠ 소그를 하나 작성해 줄수 없습니까? 제가 일단...
    • 이상준
      1999.07.24 17:57
      손연옥 께서 말씀하시기를... > QuickReport에서 저장한 파일(*.QRP)을 > 폼에서 버튼을 클릭했을때 불...
    • 손연옥
      1999.07.24 18:44
      이상준 께서 말씀하시기를... > 손연옥 께서 말씀하시기를... > > QuickReport에서 저장한 파일(*.QRP)을...
    • 손연옥
      1999.07.24 19:58
      손연옥 께서 말씀하시기를... > 이상준 께서 말씀하시기를... > > 손연옥 께서 말씀하시기를... > > > Q...
    • 구창민
      1999.07.24 04:12
      델파이 초보 께서 말씀하시기를... > 서버에 연결할 경우 User Id와 Password 입력 dialog box가 뜨지않...
    • 이용일
    • 1999.07.24 03:27
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 공병모
      1999.07.24 04:00
      이용일 께서 말씀하시기를... > 캡션없는 하나의 폼이 있거든요.. > 그 폼에 MEMO 컴포넌트가 Align--> C...
    • 별아기
    • 1999.07.24 03:19
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 김철수
      1999.07.24 06:56
      일단 Query가 빠졌는데요. Query1.sql.close; 쓰신 코드 등으로 아님 With query do begin 쓰신 코드 ...
    • 델아기
      1999.07.24 08:02
      김철수 께서 말씀하시기를... > 일단 Query가 빠졌는데요. > Query1.sql.close; > 쓰신 코드 > 등으로 ...
    • 구창민
      1999.07.24 04:03
      은종범 께서 말씀하시기를... > 현재 네 컴퓨터와 네트워크로 연결되어 있는 컴퓨터들의 이름을 알고 싶은...
    • 주경래
    • 1999.07.24 01:14
    • 1 COMMENTS
    • /
    • 0 LIKES
    • jini
      1999.07.24 01:56
      주경래 께서 말씀하시기를... > 안녕하십니까??? > 1) 레포트의 컬럼 프로퍼티를 2개이상 사용할 경우 자...
    • 하재희
    • 1999.07.24 01:12
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 정근수
      1999.07.24 01:21
      하재희 께서 말씀하시기를... > 3Tier로 서버에 Query컴포넌트와UpdateSQL컴포넌트를 연결하여 구성하고 ...