TWinSocketStream流对象用来在阻塞方式的Socket连接中发送和接收数据,从而避免一般情况下的挂起现象。下面是一个用TWinSocketStream进行收发数据的代码片段:
在一单独的线程中通过阻塞式Socket连接发送数据
void __fastcall TMyClientThread::Execute()
{
TWinSocketStream *pStream = new TWinSocketStream(ClientSocket1->Socket, 60000);
try
{
while (!Terminated && ClientSocket1->Active)
{
try
{
char buffer[10];
GetNextRequest(buffer); // GetNextRequest must be a thread-safe method
// write the request to the server
pStream->Write(buffer, strlen(buffer) + 1);
// continue the communication (eg read a response from the server)
...
}
catch (Exception &E)
{
if (!E.ClassNameIs("EAbort"))
//you must write HandleThreadException
Synchronize(HandleThreadException());
}
}
}
__finally
{
delete pStream;
}
}
五. TBlobStream介绍
方法
Read:读取数据到缓冲区中
Seek:定位流的当前位置
TBlobStream:根据一个TBlobField字段建立一个流对象
Truncate:从当前位置截短流对象
Write:将缓冲区中的数据写入到流对象中
TBlobStream流对象只用于对TblobField进行操作,注意,当改变了数据集对象的当前记录时,要重新建立TBlobStream对象并在使用完后将之删除。
读取Blob字段的数据
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int MemSize;
char *Buffer;
TBlobStream *Stream;
if (!Query1->Eof)
Query1->Next();
Stream = new TBlobStream((TBlobField *)Query1->FieldByName("Notes"), bmRead);
try
{
MemSize = Stream->Size + 1; // add one for null terminator
Buffer = new char[MemSize]; // Allocate the memory.
try
{
Stream->Read(Buffer, MemSize); //Read Notes field into buffer.
Memo1->SetTextBuf(Buffer); // Display the buffer's contents.
}
catch (...)
{
delete Buffer;
throw;
}
delete Buffer;
}
catch (...)
{
delete Stream;
throw;
}
delete Stream;
}