全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2481
推到 Plurk!
推到 Facebook!

請問要如何動態產生TClientSocket ?

答題得分者是:gemi0305
kenbcb
中階會員


發表:171
回覆:129
積分:60
註冊:2003-07-15

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-09-08 15:17:06 IP:61.222.xxx.xxx 未訂閱
請問各位, 我要如何動態產生128個TClientSocket元件,並如何寫其OnRead的事件??~ 希望能夠指導
gemi0305
版主


發表:81
回覆:564
積分:629
註冊:2003-05-11

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-09-08 16:08:31 IP:210.66.xxx.xxx 未訂閱
範例,請在form中加一個timer、一個memo,一個button h檔,加入下列程式,  
    #ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include 
#include 
#include 
#include <Forms.hpp>
#include 
#include 
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:        // IDE-managed Components
        TButton *Button1;
        TMemo *Memo1;
        TServerSocket *ServerSocket1;
        TTimer *Timer1;
        void __fastcall Button1Click(TObject *Sender);
        void __fastcall Timer1Timer(TObject *Sender);
        void __fastcall ClientSocket1Connect(TObject *Sender,
          TCustomWinSocket *Socket);
        void __fastcall ClientSocket1Read(TObject *Sender,
          TCustomWinSocket *Socket);  
private:        // User declarations
public:                // User declarations
        __fastcall TForm1(TComponent* Owner);
};
//-------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//-------------------------------------------------------------------     
cpp檔:
 
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
     Timer1->Enabled=false;
     Timer1->Interval=500;    //視連線情況調整
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
     for(int i=0; i<12; i  )  //以12個例
     {
         TClientSocket *pDynamicClient;
         pDynamicClient = new TClientSocket(this);             pDynamicClient->Name="Client" IntToStr(i);
         pDynamicClient->Address="127.0.0.1";
         pDynamicClient->Port=7717;
         pDynamicClient->OnRead = &ClientSocket1Read;
         pDynamicClient->OnConnect= &ClientSocket1Connect;
         pDynamicClient->Open();
         Timer1->Enabled=true;
         ShowMessage("Connect");         }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ClientSocket1Connect(TObject *Sender,
      TCustomWinSocket *Socket)
{
     Memo1->Lines->Add(
                         Socket->LocalAddress ":" IntToStr(Socket->LocalPort) 
                         "is connecting to Server"
                       );
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
     SendMessage(GetActiveWindow(), WM_CLOSE, 0, 0);
     Timer1->Enabled = false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ClientSocket1Read(TObject *Sender,
      TCustomWinSocket *Socket)
{
    int len=Socket->ReceiveLength();
    BYTE *ptr = new BYTE[len];
}
//---------------------------------------------------------------------------    
國泰平安
kenbcb
中階會員


發表:171
回覆:129
積分:60
註冊:2003-07-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-09-08 16:43:18 IP:61.222.xxx.xxx 未訂閱
Q1:我在form的create事件建立,會有錯誤, 事件宣告要自己輸入嗎,要拉一個ClientSocket嗎?(如果這樣用是不是會有12組連線到server) Q2:要如何指定送出的clientsocket來送資料(在OnWrite) 可以說明清楚嗎~不好意思,我看不太懂 發表人 - kenbcb 於 2003/09/08 16:51:41
gemi0305
版主


發表:81
回覆:564
積分:629
註冊:2003-05-11

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-09-08 16:51:24 IP:210.66.xxx.xxx 未訂閱
如果覺得麻煩,就先放一個TClientSocket元件在form上, 先用這個元件來寫相關的event事件(因為bcb會幫你在.h和.cpp中,幫你寫很多東西,可省去麻煩) 等這些事件寫好後,再把form上的TClientSocket拿掉就行了, 最重要的是,要有
#include    
宣告, 才能在沒有TClientSocket的form上使用TClientSocket 國泰平安 發表人 - Gemi0305 於 2003/09/08 17:03:01
gemi0305
版主


發表:81
回覆:564
積分:629
註冊:2003-05-11

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-09-08 17:21:37 IP:210.66.xxx.xxx 未訂閱
指定Client7送資料  傳送資料不需要用到OnWrite事件, 這個範例是很好用的「使用動態元件的方法」 請好好利用
void __fastcall TForm1::Button2Click(TObject *Sender)
{
     AnsiString ClientName="Client7";
     for (int i=0;iName == ClientName)
         {
             TClientSocket *TempClient = dynamic_cast(Components[i]);
             TempClient->Socket->SendBuf(ptr,Size);
         }
}     
國泰平安 發表人 - Gemi0305 於 2003/09/08 17:33:46
kenbcb
中階會員


發表:171
回覆:129
積分:60
註冊:2003-07-15

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-09-08 17:25:27 IP:61.222.xxx.xxx 未訂閱
不好意思,在請問一個問題: 要如何指定送出的clientsocket來送資料???
kenbcb
中階會員


發表:171
回覆:129
積分:60
註冊:2003-07-15

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-09-08 17:29:59 IP:61.222.xxx.xxx 未訂閱
謝謝你的幫忙~
kenbcb
中階會員


發表:171
回覆:129
積分:60
註冊:2003-07-15

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-09-09 16:11:41 IP:61.222.xxx.xxx 未訂閱
在請問一下我寫了下列程式,結果沒資料送出  
 void __fastcall TfrmSim::btnConnectClick(TObject *Sender)
{
  //connect & send information      if(edtIP->Text.IsEmpty())
  {
    ShowMessage("Sever IP is empty !");
    return;
  }
  else
  {
    for(int i=1;i<=edtIP->Text.Length();i  )
    {
       if(!(edtIP->Text.SubString(i,1)>="0" &&
            edtIP->Text.SubString(i,1)<="9" ||
            edtIP->Text.SubString(i,1)=="."))
       {
         ShowMessage("Invalid IP");
         return;
       }
    }
  }      if((cmbID->ItemIndex == -1) || (cmbID->ItemIndex >= MAX_Control))
  {
    ShowMessage("No select GDT !");
    return;
  }      char Buf[500]={0};
  int len,ptr = cmbID->ItemIndex;      fpBuf.Leading = Header;
  fpBuf.Control = DATA;
  fpBuf.To = Peer;
  fpBuf.Length = sizeof(GDT_Type);
  fpBuf.SenderSN = 0;
  fpBuf.ReceiverSN = 0;
  fpBuf.Type = GDT_Info;
  Trail = Trailer;      memmove((char *)Buf,(char *)&fpBuf,sizeof(fpBuf));
  memmove((char *)Buf sizeof(fpBuf),(char *)(GDT ptr),sizeof(GDT_Type));
  CRC = CRC_Compute((char *)Buf,sizeof(fpBuf) fpBuf.Length);
  memmove((char *)Buf sizeof(fpBuf) fpBuf.Length,(char *)&CRC,sizeof(CRC));
  memmove((char *)Buf sizeof(fpBuf) fpBuf.Length sizeof(CRC),(char *)&Trail,sizeof(Trail));      len = sizeof(fpBuf) fpBuf.Length sizeof(CRC) sizeof(Trail);      AnsiString ClientName = "Client" IntToStr(ptr);
  for(int i=0;iName == ClientName)
     {
       TClientSocket *ConnectClient = dynamic_cast(Components[i]);
       ConnectClient->Address = edtIP->Text;
       ConnectClient->Port = GDTPort;
       if(ConnectClient->Socket->Connected)
       {
         ShowMessage("Connected");
         return;
       }
       ConnectClient->Open();
       ConnectClient->Socket->SendBuf((char *)Buf,len);
     }
  }
}
//---------------------------------------------------------------------------
gemi0305
版主


發表:81
回覆:564
積分:629
註冊:2003-05-11

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-09-09 16:20:19 IP:210.66.xxx.xxx 未訂閱
我是用看的, 你是跟本就沒連上去... 我在第一篇新增的程式中,在 pDynamicClient->Open(); 下面有兩行,是很重要的兩行,
 
Timer1->Enabled=true;
ShowMessage("Connect");
 
少了這兩行你動態新増的Client是連不上server的, 所以你要在 ConnectClient->Open();下面 加這兩行,如果你要手動關到ShowMessage的話,加一行 ShowMessage("Connect"); 就可以了timer不用加 國泰平安
kenbcb
中階會員


發表:171
回覆:129
積分:60
註冊:2003-07-15

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-09-09 16:34:02 IP:61.222.xxx.xxx 未訂閱
我要用手動的(如用一個listbox選其中個,然後按button一下連線),要如何加
gemi0305
版主


發表:81
回覆:564
積分:629
註冊:2003-05-11

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-09-09 17:04:03 IP:210.66.xxx.xxx 未訂閱
一樣,ShowMessage()是一定要加的, 我所謂的手動,是說用手動關掉ShowMessage(), 但你也可以用timer自動把ShowMessage()給關掉,就像第一個範例, 你會發現ShowMessage()會自動出來,又自動被關掉, 其作用,就是在幫助Client連線到Server, 因為在bcb裡,如果你Open()之後,不讓他有個小間隔,是連不上server的, 以前我也是找了很久才找到這個方法, 所以在ShowMessage()是加在Open()後面,接下來,就只是要等多久了, 我從新竹連高雄,最多二秒...所以最多二秒就可以關這個ShowMessage() 開會去...*忙* 國泰平安
系統時間:2024-04-18 8:55:30
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!