線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1574
推到 Plurk!
推到 Facebook!

請問OnConnect與OnDisConnect的問題

缺席
willchen
初階會員


發表:64
回覆:81
積分:29
註冊:2003-05-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-09-02 17:37:39 IP:211.74.xxx.xxx 未訂閱
 //---------------------------------------------------------------------------    #include 
#pragma hdrstop    #include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
 Server->DefaultPort=7777;
}
//---------------------------------------------------------------------------    void __fastcall TForm1::ServerConnect(TIdPeerThread *AThread)
{
 ShowMessage(AThread->Connection->Socket->Binding->PeerIP);
}
//---------------------------------------------------------------------------    void __fastcall TForm1::ServerDisconnect(TIdPeerThread *AThread)
{
 ShowMessage(AThread->Connection->Socket->Binding->PeerIP);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
 Server->Active=True;
}
//---------------------------------------------------------------------------
以上是Server端的程式,但是我用Client連線時,卻會在Server端ShowMessage兩次Client端的IP,這是什麼原因(我還沒按Client離線),照理來說應該只ShowMessage一次而已才對(PS:我使用INDY元件寫)以下是我的Client端的程式
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
 Client->Port=7777;
 Client->Host="127.0.0.1";
}
//---------------------------------------------------------------------------    void __fastcall TForm1::Button1Click(TObject *Sender)
{
 Client->Connect();        
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
 Client->Disconnect();
}
//--------------------------------------------------------------------------- 
brook
資深會員


發表:57
回覆:323
積分:371
註冊:2002-07-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-09-05 17:58:28 IP:218.160.xxx.xxx 未訂閱
試看看加一行,但為什麼我也不知道. void __fastcall TForm1::ServerConnect(TIdPeerThread *AThread) { ShowMessage(AThread->Connection->Socket->Binding->PeerIP); AThread->Connection->CurrentReadBuffer(); }
jow
尊榮會員


發表:66
回覆:751
積分:1253
註冊:2002-03-13

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-09-10 18:37:38 IP:211.74.xxx.xxx 未訂閱
就我所知,Indy 的WinSocket元件基本上是Sync(同步)的,因此當您的Client端 與Server端建立連線並尋求服務後即會被離線(因為Server端的Thread已結束), 至於如何去Implement一個Indy TCP Server程式,我想您可以參考Indy提供的 Demo程式, TCPStreamClientServer, 在BCB的Demos\Indy下應該找得到.    至於TCP在實作上的Sync(同步)與ASync(非同步)的差異,就我本身有限的認知 上來說,在ASync模式下TCP Server 載明的IP:Port負責Listening Client端的 連線要求,並在接受(Accept)連線要求後,會另外產生一個Socket負責Service 這個Client端的連線,而所有額外產生用來服務個別Client連線的Socket在執行 時是共用同一個Thread的.    而Sync形式的TCP Sevver,用來服務Client端的Socket是個別獨立的Thread的.    Note: 就是 Blocking & Non-Blocking 了.    個人觀點, 有誤請指正, TKS.
系統時間:2024-04-25 13:25:58
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!