關于 Indy 的發送與接收 及 不定長度流的見解
系統
1899 0
Delphi2010 的Indy10中各種IOHandler提供了相應的ReadXXX 與 WriteXXX方法。
在一個Client / Server 的通迅中。我們會用到以上方法,當我們寫一個流時,我們需要關心的是流的大小。一般做法是先把流大小發送過去,在返回
準備好
之后再發送流。
下面做一個假設:
在一個連接的基礎上
Server (1) 發送流大小,等待返回
Client? (2)讀出流大小,發送
準備好
Client? (2)要求發送其它命令
這時 (2) 這一步驟,若要求發送其它命令在前的話,Server 讀到的就不是
準備好
命令了。
為了避免或者說為了說明
一次性命令
內容,我們可以使用結構來完成 Server 的要求,即
發送一個帶命令的流
。
為了以上目的。我們需要定義一個結構
??? TCommandContext = Record
????????? Command:string[50];
????????? StreamSize:integer;
???? end;
這樣命令放入 Command 中,后續流的大小放入StreamSize里。
一、讀取
?
Code
var
??Context:TCommandContext;
??ContextStream,FReadableStream:TMemoryStream;
begin
????ContextStream:
=
TMemoryStream.Create;
????FReadableStream:
=
TMemoryStream.Create;
????FTCPClient.IOHandler.ReadStream(ContextStream,SizeOf(Context),False);
//
讀取流的結構部分
????ContextStream.Position:
=
0
;
????ContextStream.Read(Context,SizeOf(Context));
//
解出結構
//
????Context.Command
????FTCPClient.IOHandler.ReadStream(FReadableStream,Context.StreamSize,False);
//
根據大小讀取剩下的流
..
end
;
?
二、寫入
?
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
;
?
需要注意的是寫入流時用到的是 Write方法,不需要加Stream.Size,不然你就會得到一個出錯提示。
關于 Indy 的發送與接收 及 不定長度流的見解
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元