DataFlex
DataFlex
ReceiveString Returns Only the Immediately Available Data
See more Socket/SSL/TLS Examples
Demonstrates that Socket.ReceiveString returns only the text immediately available and not the entire response. The example connects to chilkatsoft.com over TLS and requests big_helloWorld.txt, a large text file of roughly 74,000 lines. A single ReceiveString call returns just the first portion of the response, and the example reports how many characters were received compared with the total size given by the response Content-Length header.
Background. Because ReceiveString returns whatever text is currently available, one call cannot indicate whether the full response has arrived. Knowing when a response is complete requires either a known expected length (such as a Content-Length header or an application-defined length prefix), receiving in a loop until that many bytes are collected, or receiving until the peer closes the connection. This example sends a minimal HTTP request only to exercise ReceiveString against a public server; for actual HTTP work, use the Chilkat Http, Rest, or HttpCurl classes.
Chilkat DataFlex Downloads
Use ChilkatAx-win32.pkg
Procedure Test
Boolean iSuccess
Handle hoSocket
Boolean iBTls
Integer iMaxWaitMs
String sHttpReq
String sResponseText
Handle hoSb
String sContentLength
String sTemp1
Integer iTemp1
Boolean bTemp1
Move False To iSuccess
Get Create (RefClass(cComChilkatSocket)) To hoSocket
If (Not(IsComObjectCreated(hoSocket))) Begin
Send CreateComObject of hoSocket
End
// Connect to chilkatsoft.com over TLS.
Move True To iBTls
Move 5000 To iMaxWaitMs
Get ComConnect Of hoSocket "chilkatsoft.com" 443 iBTls iMaxWaitMs To iSuccess
If (iSuccess = False) Begin
Get ComLastErrorText Of hoSocket To sTemp1
Showln sTemp1
Procedure_Return
End
Set ComStringCharset Of hoSocket To "utf-8"
// Send an HTTP GET request for big_helloWorld.txt, a large text file of roughly 74,000 lines of
// "Hello World!". This uses a minimal HTTP request only to exercise ReceiveString against a public
// server -- for real HTTP work, use the Chilkat Http, Rest, or HttpCurl classes instead.
Move "GET /big_helloWorld.txt HTTP/1.1" + (character(13)) + (character(10)) + "Host: chilkatsoft.com" + (character(13)) + (character(10)) + "Connection: close" + (character(13)) + (character(10)) + (character(13)) + (character(10)) To sHttpReq
Get ComSendString Of hoSocket sHttpReq To iSuccess
If (iSuccess = False) Begin
Get ComLastErrorText Of hoSocket To sTemp1
Showln sTemp1
Procedure_Return
End
// Call ReceiveString a single time. It returns only the text that is immediately available --
// typically just the first network packet -- and does NOT wait for the entire response to arrive.
Get ComReceiveString Of hoSocket To sResponseText
Get ComLastMethodSuccess Of hoSocket To bTemp1
If (bTemp1 = False) Begin
Get ComLastErrorText Of hoSocket To sTemp1
Showln sTemp1
Procedure_Return
End
// Load the received text into a StringBuilder so its length can be measured and the Content-Length
// header extracted. The Content-Length header gives the total size, in bytes, of the response body.
Get Create (RefClass(cComChilkatStringBuilder)) To hoSb
If (Not(IsComObjectCreated(hoSb))) Begin
Send CreateComObject of hoSb
End
Get ComAppend Of hoSb sResponseText To iSuccess
Get ComGetBetween Of hoSb "Content-Length: " (character(13)) + (character(10)) To sContentLength
Get ComLastMethodSuccess Of hoSb To bTemp1
If (bTemp1 = False) Begin
Get ComLastErrorText Of hoSb To sTemp1
Showln sTemp1
Procedure_Return
End
// Compare what this single ReceiveString returned against the full size of the expected response.
// The received amount is only a small fraction of the total.
Get ComLength Of hoSb To iTemp1
Showln "Characters received so far (headers + partial body): " iTemp1
Showln "Expected response body size (Content-Length): " sContentLength " bytes"
// A single ReceiveString call returns whatever is currently available, so it cannot indicate whether
// the full response has arrived. This makes it difficult to know when a response is complete: the
// application must either know how many bytes to expect (for example from a Content-Length header or
// an application-defined length prefix) and keep receiving until that many bytes are collected, or
// keep receiving until the peer closes the connection.
End_Procedure