Buffering example for Indy 10
外国のフォーラムでIndy 10がBufferを操作することについての文章を見て、記録した.
CLIENT (Delphi)
{ vBufferIn: TIdBytes; }
{ vBufferOut: TIdBytes; }
{ Set the length of the buffer for the request }
SetLength(vBufferIn,length(pInputXML));
StringSize := Length(pInputXML);
{ Load the bytes array }
for i := 0 to StringSize - 1 do
begin
vBufferIn[i] := Byte(pInputXML[i+1]);
end;
{ Send the request }
FSocket.IOHandler.Write(vBufferIn);
BufferSize := 0;
TotalBufferSize := 0;
{ Set the length as zero means set as dynamic and leaving
Indy to work with the size of the array. }
SetLength(vBufferOut,0);
{ Loop while the socket is connected }
while (FSocket.Connected) do
begin
{ fill the output buffer with a timeout of 10 ms }
FSocket.IOHandler.CheckForDataOnSource(10);
{ Returns true if the output buffer is currently empty }
if not (FSocket.IOHandler.InputBufferIsEmpty) then
begin
{ get the size of the output buffer }
BufferSize := FSocket.IOHandler.InputBuffer.Size;
{ save the size of the output buffer and add it to the total for the array }
TotalBufferSize := TotalBufferSize + BufferSize;
{ read the output buffer and save it into the array }
{ N.B the last parameter is very important is the AAppend and if you
set as true means the buffer is added at the end otherwise if set to false
the buffer cover the array from the begin. }
FSocket.IOHandler.ReadBytes(vBufferOut, BufferSize, true);
end;
end;
{ moves the byte array into the string }
pOutPutXML := BytesToString(vBufferOut, 0, TotalBufferSize);
+------------------------------------------------------------+
CLIENT (C#) (don't care about base64 this is only because this client is a web service and the SOAP
envelope consumed by a WIN32 client SOAP had encoding problems.)
Byte[] RecvBytes = new Byte[0];
Byte[] OutRecvBytes = new Byte[0];
// Decode the input into a bytes array converting the string
// representation of a value of base 64 digits to an equivalent
// array of 8-bit unsigned integers
RecvBytes = System.Convert.FromBase64String(InputXML);
// Send the request
mySocket.IOHandler.Write(RecvBytes);
// Receive response
int BufferSize = 0;
// Loop until the socket is connected
while (mySocket.Connected())
{
// fill the input buffer with a timeout of 10 ms
mySocket.IOHandler.CheckForDataOnSource(10);
// Returns true if the input buffer is currently empty
if (! mySocket.IOHandler.InputBufferIsEmpty())
{
// get the size of the input buffer
BufferSize = mySocket.IOHandler.InputBuffer.Size;
// Read the input buffer and save it into the array
// N.B the last parameter is very important is the AAppend and if you
// set as true means the buffer is added at the end otherwise if set to false
// the buffer cover the array from the begin
mySocket.IOHandler.ReadBytes(ref OutRecvBytes, BufferSize, true);
} // end if
} // end while (mySocket.Connected())
// Converts the value of an array of 8-bit unsigned integers to equivalent String
// representation consisting of base 64 digits.
OutputXML = System.Convert.ToBase64String(OutRecvBytes,0,OutRecvBytes.Length);
+------------------------------------------------------------+
SERVER CONNECTION
{ vBuffer: TIdBytes; }
{ vInputData: WideString }
{ Get the data }
BufferSize := 0;
TotalBufferSize := 0;
{ We must wait for a request }
{ Setting the length as zero means set as dynamic and leaving
Indy to work with the size of the array. }
SetLength(vBuffer,0);
{ fill the input buffer with a timeout of 10 ms }
vTET.Connection.IOHandler.CheckForDataOnSource(10);
{ loop until the input buffer is empty }
repeat
{ Returns true if the input buffer is currently empty }
if not (vTET.Connection.IOHandler.InputBufferIsEmpty()) then
begin
{ get the size of the input buffer }
BufferSize := vTET.Connection.IOHandler.InputBuffer.Size;
{ save the size of the input buffer and add it to the total for the array }
TotalBufferSize := TotalBufferSize + BufferSize;
{ read the input buffer and save it into the array }
{ N.B the last parameter is very important is the AAppend and if you
set as true means the buffer is added at the end otherwise if set to false
the buffer cover the array from the begin. }
vTET.Connection.IOHandler.ReadBytes(vBuffer, BufferSize, true);
end;
vTET.Connection.IOHandler.CheckForDataOnSource(10);
until (vTET.Connection.IOHandler.InputBufferIsEmpty());
{ moves the byte array into the string }
vInputData := BytesToString(vBuffer, 0, TotalBufferSize);
+------------------------------------------------------------+
SERVER EXECUTE
{ vBuffer: TIdBytes; }
{ vOutputXML: WideString }
{ Send the data }
SetLength(vBuffer,length(vOutputXML));
for i := 0 to length(vOutputXML) -1 do
begin
vBuffer[i] := Byte(vOutputXML[i+1]);
end;
IOHandler.Write(vBuffer);