아래에 소스가 있습니다.
지금 테스트 하고 있습니다.
그런데.. 이게 잘 안되요...
데이타를 읽어들이고 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;
> 아래에 소스가 있습니다.
>
> 지금 테스트 하고 있습니다.
> 그런데.. 이게 잘 안되요...
> 데이타를 읽어들이고 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인지 헷갈리네여.
좀만 더 구체적인 질문이었음 혹시 알아차리지 않을까 싶네여. 제가 허접이라서리. -_+
구럼 즐프 하세엽. 아무 것두 도움 되는게 없었군. 죄송.