Q&A

  • 소켓 서버 프로그램인데 에러가.... 도와주세요
아래에 소스가 있습니다.



지금 테스트 하고 있습니다.

그런데.. 이게 잘 안되요...

데이타를 읽어들이고 ClientDataSet을 이용해서 Stream형으로 만듭니다.

그리고 이 Stream을 소켓을 이용해서 전송하거든요?

그런데.. 분명히 커리는 제대로 읽어 들였는데...

클라이언트에서 전송을 받으면 (걸리는 시간 약 0.5초)

전체 데이타가 아닌 그냥 20여개의 데이만 넘어옵니다.

나머지는 모두 공백으로 되고요...

정확히 8864byte만 전송되거든요? 이거 어떻게 해야 되요..

뭐가 잘못되었는지도 모르겠어요..

도움을.. 부탁합니다.



procedure TMyServerThread.ClientExecute;

var

Stream: TWinSocketStream;

Buffer: array [0..25] of Char;

PacketStream: TStream;

DataPacket: Pointer;

StreamSize: Integer;

begin

// 이 스레드에 대한 COM 초기 라이브러리

CoInitialize(nil);

try

// 연결이 활성화되어 있는 지 확인하다.

while not Terminated and ClientSocket.Connected do

begin

try

Stream := TWinSocketStream.Create(ClientSocket, 10000);

try

// 요청 버퍼 준비

FillChar(Buffer, SizeOf(Buffer), 0);

// 클라이언트 데이터를 사용할 때까지 10 초 기다린다.

if Stream.WaitForData(10000) then

begin

Stream.Read(Buffer, SizeOf(Buffer));

if Buffer = 'GetDepartments' then

begin

// 클라이언트 애플리케이션에 대한 데이터 패킷 생성

PacketStream := TMemoryStream.Create;

try

// 데이터 모듈과 작동하는 것이 오직 한 개의 스레드인지 확인한다.

DataModule2.FCSect.Enter;

try

// 데이터 패킷 생성

DataModule2.ClientDataSet1.Open;

try

// 데이터 패킷을 임시 스트림에 저장한다.

DataModule2.ClientDataSet1.SaveToStream(PacketStream, dfBinary );

finally

// 데이터 패킷을 파괴한다.

DataModule2.ClientDataSet1.Close;

end;

finally

// 다른 스레드도 처리하기 위해 크리티컬 섹션을 해제한다.

DataModule2.FCSect.Leave;

end;

StreamSize := PacketStream.Size;

// 데이터 패킷을 크기를 작성한다.

Stream.Write(StreamSize, SizeOf(StreamSize));

// 데이터 패킷을 스트림에 넣는다.

DataPacket := AllocMem(StreamSize);

try

PacketStream.Position := 0;

PacketStream.Read(DataPacket^, StreamSize);

Stream.Write(DataPacket^, StreamSize);

finally

FreeMem(DataPacket);

end;

finally

PacketStream.Free;

Terminate;

end;

end else

if Buffer = 'ApplyDepartmentUpdates' then

begin

// 클라이언트의 ApplyUpdates 요청을 처리한다.

end;

end else

ClientSocket.Close;

finally

Stream.Free;

end;

except

HandleException;

end;

end;

finally

// 스레드의 COM 라이브러리를 해제한다.

CoUninitialize;

end;

end;





1  COMMENTS
  • Profile
    fallroot 2000.02.11 06:23
    하얀까마귀 wrote:

    > 아래에 소스가 있습니다.

    >

    > 지금 테스트 하고 있습니다.

    > 그런데.. 이게 잘 안되요...

    > 데이타를 읽어들이고 ClientDataSet을 이용해서 Stream형으로 만듭니다.

    > 그리고 이 Stream을 소켓을 이용해서 전송하거든요?

    > 그런데.. 분명히 커리는 제대로 읽어 들였는데...

    > 클라이언트에서 전송을 받으면 (걸리는 시간 약 0.5초)

    > 전체 데이타가 아닌 그냥 20여개의 데이만 넘어옵니다.

    > 나머지는 모두 공백으로 되고요...

    > 정확히 8864byte만 전송되거든요? 이거 어떻게 해야 되요..

    > 뭐가 잘못되었는지도 모르겠어요..

    > 도움을.. 부탁합니다.

    >

    > procedure TMyServerThread.ClientExecute;

    > var

    > Stream: TWinSocketStream;

    > Buffer: array [0..25] of Char;

    > PacketStream: TStream;

    > DataPacket: Pointer;

    > StreamSize: Integer;

    > begin

    > // 이 스레드에 대한 COM 초기 라이브러리

    > CoInitialize(nil);

    > try

    > // 연결이 활성화되어 있는 지 확인하다.

    > while not Terminated and ClientSocket.Connected do

    > begin

    > try

    > Stream := TWinSocketStream.Create(ClientSocket, 10000);

    > try

    > // 요청 버퍼 준비

    > FillChar(Buffer, SizeOf(Buffer), 0);

    > // 클라이언트 데이터를 사용할 때까지 10 초 기다린다.

    > if Stream.WaitForData(10000) then

    > begin

    > Stream.Read(Buffer, SizeOf(Buffer));

    > if Buffer = 'GetDepartments' then

    > begin

    > // 클라이언트 애플리케이션에 대한 데이터 패킷 생성

    > PacketStream := TMemoryStream.Create;

    > try

    > // 데이터 모듈과 작동하는 것이 오직 한 개의 스레드인지 확인한다.

    > DataModule2.FCSect.Enter;

    > try

    > // 데이터 패킷 생성

    > DataModule2.ClientDataSet1.Open;

    > try

    > // 데이터 패킷을 임시 스트림에 저장한다.

    > DataModule2.ClientDataSet1.SaveToStream(PacketStream, dfBinary );

    > finally

    > // 데이터 패킷을 파괴한다.

    > DataModule2.ClientDataSet1.Close;

    > end;

    > finally

    > // 다른 스레드도 처리하기 위해 크리티컬 섹션을 해제한다.

    > DataModule2.FCSect.Leave;

    > end;

    > StreamSize := PacketStream.Size;

    > // 데이터 패킷을 크기를 작성한다.

    > Stream.Write(StreamSize, SizeOf(StreamSize));

    > // 데이터 패킷을 스트림에 넣는다.

    > DataPacket := AllocMem(StreamSize);

    > try

    > PacketStream.Position := 0;

    > PacketStream.Read(DataPacket^, StreamSize);

    > Stream.Write(DataPacket^, StreamSize);

    > finally

    > FreeMem(DataPacket);

    > end;

    > finally

    > PacketStream.Free;

    > Terminate;

    > end;

    > end else

    > if Buffer = 'ApplyDepartmentUpdates' then

    > begin

    > // 클라이언트의 ApplyUpdates 요청을 처리한다.

    > end;

    > end else

    > ClientSocket.Close;

    > finally

    > Stream.Free;

    > end;

    > except

    > HandleException;

    > end;

    > end;

    > finally

    > // 스레드의 COM 라이브러리를 해제한다.

    > CoUninitialize;

    > end;

    > end;

    >

    안녕하세여.

    역쉬 고수의 코드는 알아보기가 힘드옵니당. T.T

    서버 프로그램이라구 하셨는데 ClientDataSet을 쓰시는 거랑 DataModule이 Remote Data Module인지 헷갈리네여.

    좀만 더 구체적인 질문이었음 혹시 알아차리지 않을까 싶네여. 제가 허접이라서리. -_+

    구럼 즐프 하세엽. 아무 것두 도움 되는게 없었군. 죄송.