關(guān)于 Indy 的發(fā)送與接收 及 不定長(zhǎng)度流的見(jiàn)解
系統(tǒng)
2189 0
Delphi2010 的Indy10中各種IOHandler提供了相應(yīng)的ReadXXX 與 WriteXXX方法。
在一個(gè)Client / Server 的通迅中。我們會(huì)用到以上方法,當(dāng)我們寫(xiě)一個(gè)流時(shí),我們需要關(guān)心的是流的大小。一般做法是先把流大小發(fā)送過(guò)去,在返回
準(zhǔn)備好
之后再發(fā)送流。
下面做一個(gè)假設(shè):
在一個(gè)連接的基礎(chǔ)上
Server (1) 發(fā)送流大小,等待返回
Client? (2)讀出流大小,發(fā)送
準(zhǔn)備好
Client? (2)要求發(fā)送其它命令
這時(shí) (2) 這一步驟,若要求發(fā)送其它命令在前的話,Server 讀到的就不是
準(zhǔn)備好
命令了。
為了避免或者說(shuō)為了說(shuō)明
一次性命令
內(nèi)容,我們可以使用結(jié)構(gòu)來(lái)完成 Server 的要求,即
發(fā)送一個(gè)帶命令的流
。
為了以上目的。我們需要定義一個(gè)結(jié)構(gòu)
??? TCommandContext = Record
????????? Command:string[50];
????????? StreamSize:integer;
???? end;
這樣命令放入 Command 中,后續(xù)流的大小放入StreamSize里。
一、讀取
?
Code
var
??Context:TCommandContext;
??ContextStream,FReadableStream:TMemoryStream;
begin
????ContextStream:
=
TMemoryStream.Create;
????FReadableStream:
=
TMemoryStream.Create;
????FTCPClient.IOHandler.ReadStream(ContextStream,SizeOf(Context),False);
//
讀取流的結(jié)構(gòu)部分
????ContextStream.Position:
=
0
;
????ContextStream.Read(Context,SizeOf(Context));
//
解出結(jié)構(gòu)
//
????Context.Command
????FTCPClient.IOHandler.ReadStream(FReadableStream,Context.StreamSize,False);
//
根據(jù)大小讀取剩下的流
..
end
;
?
二、寫(xiě)入
?
Code
var
??jpg:TJPEGImage;
??JpgStream,SendStream:TMemoryStream;
??Context:TCommandContext;
begin
????jpg:
=
TJPEGImage.Create;
????JpgStream:
=
TMemoryStream.Create;
????SendStream:
=
TMemoryStream.Create;
????
try
??????jpg.Assign(FBlockBMP);
??????jpg.CompressionQuality:
=
100
;
??????jpg.Compress;
??????jpg.SaveToStream(JpgStream);
??????JpgStream.Position:
=
0
;
??????
with
?Context?
do
??????
begin
????????StreamSize:
=
JpgStream.Size;
????????Command:
=
'
test?command
'
;
??????
end
;
??????SendStream.Write(Context,SizeOf(Context));
??????SendStream.CopyFrom(JpgStream,JpgStream.size);
??????FIOHandler.Write(SendStream);
.
end
;
?
需要注意的是寫(xiě)入流時(shí)用到的是 Write方法,不需要加Stream.Size,不然你就會(huì)得到一個(gè)出錯(cuò)提示。
關(guān)于 Indy 的發(fā)送與接收 及 不定長(zhǎng)度流的見(jiàn)解
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元