用Indy元件開發Socket應用程式

2021-04-13 07:10:47 字數 2620 閱讀 7577

indy伺服器模型

乙個典型的unix伺服器有乙個或多個監聽程序,它們不停地監聽進入的客戶連線請求。對於每乙個需要服務的客戶,都fork乙個新程序來處理該客戶的所有事務。這樣乙個程序只處理乙個客戶連線,程式設計就變得十分容易。

indy伺服器工作原理同unix伺服器十分類似,只是windows不像unix那樣支援fork,而是支援執行緒,因此indy伺服器為每乙個客戶連線分配乙個執行緒。

圖1顯示了indy伺服器的工作原理。indy伺服器元件建立乙個同應用程式主線程分離的監聽執行緒來監聽客戶連線請求,對於接受的每乙個客戶,都建立乙個新的執行緒來為該客戶提供服務,所有與這一客戶相關的事務都由該執行緒來處理。

使用元件tidthreadmgrpool,indy還支援執行緒池。

執行緒與indy客戶程式

indy客戶端元件並未使用執行緒。但是在一些高階的客戶程式中,程式設計師可以在自定義的執行緒中使用indy客戶端元件,以使使用者介面更加友好。

簡單的indy應用示例

下面將建立乙個簡單的tcp客戶程式和乙個簡單的tcp伺服器來演示indy的基本使用方法。客戶程式使用tcp協議同伺服器連線,並向伺服器傳送使用者所輸入資料。伺服器支援兩條命令:data和quit。在data命令後跟隨要傳送的資料,並用空格將命令字data和資料分隔開。

表單布局

建立乙個專案組,新增乙個客戶程式專案和乙個伺服器專案。客戶程式和伺服器程式的表單布局如同2和圖3所示。客戶程式表單上放置了tidtcpclient元件,伺服器程式表單上放置了tidtcpserver元件。為防止客戶程式「凍結」,還在其表單上放置tidantifreeze元件。

客戶程式和伺服器程式的表單上都放置有tlistbox元件,用來顯示通訊記錄。

客戶程式**

客戶程式片斷如**列表1所示。

**列表1

procedure tformmain.btnconnectclick(sender: tobject);

begin

idtcpclient.host := edthost.text;

idtcpclient.port := strtoint(edtport.text);

lblog.items.add('正在連線 ' + edthost.text + '...');

with idtcpclient do

begin

tryconnect(5000);

trylblog.items.add(readln());

btnconnect.enabled := false;

btnsend.enabled := true;

b***isconnect.enabled := true;

except

lblog.items.add('遠端主機無響應!');

idtcpclient.disconnect();

end;//end try

except

lblog.items.add('無法建立到' + edthost.text + '的連線!');

end;//end try

end;//end with

end;

procedure tformmain.btnsendclick(sender: tobject);

begin

lblog.items.add('data ' + edtdata.text);

with idtcpclient do

begin

trywriteln('data ' + edtdata.text);

lblog.items.add(readln())

except

lblog.items.add('傳送資料失敗!');

idtcpclient.disconnect();

lblog.items.add('同主機 ' + edthost.text + ' 的連線已斷開!');

btnconnect.enabled := true;

btnsend.enabled := false;

b***isconnect.enabled := false;

end;//end try

end;//end with

end;

procedure tformmain.b***isconnectclick(sender: tobject);

varreceived: string;

begin

lblog.items.a

用indy的stmp實現郵件的群發

前段時間由於業務的需要,需封裝乙個能 郵件的dll供系統呼叫。於是考慮到indy了。indy 10 version 10.5.8.3。呼叫者提供 收信人列表 郵件之間用 分割 郵件主題,附件列表 附件之間用 分割 function sendmail v mails,v subject,v files...

用Indy建立收發電子郵件的例子

1 建立工程,在窗體中加入idsmtp1 idmessage1和idpop31 indy控制項標籤組 控制項各乙個。2 設定 idsmtp1.host smtp.163.com 我用的是163檢試,具體也可選擇其它伺服器 idsmtp1.username caoyan528 此處即表示郵箱的帳號名,...

iOS開發 Socket程式設計

socket程式設計 一 了解網路各個協議 tcp ip socket http等 網路七層由下往上分別為物理層 資料鏈路層 網路層 傳輸層 會話層 表示層和應用層。其中物理層 資料鏈路層和網路層通常被稱作 層,是網路工程師所研究的物件 傳輸層 會話層 表示層和應用層則被稱作主機層,是使用者所面向和...