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

Tserver與Tclient 資料傳送與接收的問題?

答題得分者是:andychang1690
kndd
一般會員


發表:4
回覆:8
積分:2
註冊:2004-05-05

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-06-28 01:49:03 IP:203.204.xxx.xxx 未訂閱
想請問一下我看了版上的文章寫了一個簡易的聊天室 並當Client加入時放到ListBox裡面 小弟想寫一個當滑鼠點ListBox裡的Client時 可以顯示出該Client的內容ex:生日,年齡,性別等 但是我想了很久都想不出要怎麼把資料包起來傳輸過去 小弟只能寫出傳輸聊天文字而已,如果把生日,年齡,性別一起傳過去的 話會出現在聊天的內容裡面....想請問一下該如何寫才能正確的 傳送資料與在接收時能分辨出資料的內容與型式
wyndog
資深會員


發表:7
回覆:362
積分:348
註冊:2004-10-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-06-28 11:13:56 IP:60.248.xxx.xxx 未訂閱
這不會很難啊,最簡單的方式就是 使用這個聊天室的時候,要先請使用者輸入基本資料 然後存檔 比如說,你按右鍵查基料,就是送一個 [Query] 給他,對方的程式收到 [Query] 不要顯示 然後送出基本資料,可能長這樣 [Reply:Age=22;BirthDay=2005/01/01;!@#!#] 這樣,你收到的時候,一樣,看到 [Replay 就當作傳回基本資料 不要當成聊天內容的一部份 至於,什麼樣的字串要當成自己的指令來用 就自己決定吧,只要留意說,不要是聊天時常用的文句即可
andychang1690
資深會員


發表:20
回覆:694
積分:442
註冊:2003-03-14

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-06-28 11:50:36 IP:221.169.xxx.xxx 未訂閱
kndd:下面範例
傳送方:
AnsiString StrText="Birthday=" Birthday "\r\nYearold=" Yearold "\r\n";
Socket->Socket->SendText(Str_->Text);    接收方:
void __fastcall TForm1::ClientSocketRead(TObject *Sender,
      TCustomWinSocket *Socket)
{
  TStrings *Str_;
  Str_=new TStringList();
  Str_->Clear();
  if (Str_->Values["Birthday"].IsEmpty()) { // 有傳入生日
    ...
  }
  if (Str_->Values["Yearold"].IsEmpty()) { // 有傳入年齡
    ....
  }      delete Str_;
}
TString用法本園地說明很多,你可以搜查一下!
請參考!
Andy Chang
------
Andy Chang
kndd
一般會員


發表:4
回覆:8
積分:2
註冊:2004-05-05

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-06-29 07:23:50 IP:203.204.xxx.xxx 未訂閱
引言:
kndd:下面範例
傳送方:
AnsiString StrText="Birthday=" Birthday "\r\nYearold=" Yearold "\r\n";
Socket->Socket->SendText(Str_->Text);    接收方:
void __fastcall TForm1::ClientSocketRead(TObject *Sender,
      TCustomWinSocket *Socket)
{
  TStrings *Str_;
  Str_=new TStringList();
  Str_->Clear();
  if (Str_->Values["Birthday"].IsEmpty()) { // 有傳入生日
    ...
  }
  if (Str_->Values["Yearold"].IsEmpty()) { // 有傳入年齡
    ....
  }      delete Str_;
}
TString用法本園地說明很多,你可以搜查一下!
請參考!
Andy Chang
謝謝您的解答~但是如果Client有很多個人的話,那Server那邊要如何寫呢? 小弟是個剛學程式的新手~很多都語法與資料結構都還不太會~請多多包含
andychang1690
資深會員


發表:20
回覆:694
積分:442
註冊:2003-03-14

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-06-29 10:43:18 IP:221.169.xxx.xxx 未訂閱
kndd:你可以建立Thread的方式(我建議以Thread方式)
例建立TStrings *Str_; 為全域變數,於.h檔中
private:        // User declarations
  MsgThread *msgthread; //多執行緒程式
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
extern TStrings* Str_;
//---------------------------------------------------------------------------
#endif
.Cpp檔
TForm1 *Form1;
TStrings* Str_;    void __fastcall TForm1::FormCreate(TObject *Sender)
{
  ServerSocket->Active = true ;
  Str_=new TStringList();
  msgthread = new MsgThread();
}
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
  if (msgthread) msgthread->Terminate();
  ServerSocket->Active = false ;
  delete Str_;
}
void __fastcall TForm1::ServerSocketClientRead(TObject *Sender,
      TCustomWinSocket *Socket)
{
  AnsiString S;
  S="IP_ADDR=" Socket->RemoteAddress "\r\n"; //Client的IP
  S ="IP_PORT=" IntToStr(Socket->RemotePort) "\r\n"; //Client的Port
  Str_->Add( S Socket->ReceiveText()); // 儲存至String中
}    Thread的.Cpp檔
//---------------------------------------------------------------------------    #include 
#pragma hdrstop    #include "Msg_Thread.h"
#include "Unit1.h"
#pragma package(smart_init)
//---------------------------------------------------------------------------    //   Important: Methods and properties of objects in VCL can only be
//   used in a method called using Synchronize, for example:
//
//      Synchronize(UpdateCaption);
//
//   where UpdateCaption could look like:
//
//      void __fastcall MsgThread::UpdateCaption()
//      {
//        Form1->Caption = "Updated in a thread";
//      }
//---------------------------------------------------------------------------    __fastcall MsgThread::MsgThread()
  : TThread(false)
{
}
__fastcall MsgThread::~MsgThread()
{
}
//---------------------------------------------------------------------------
void __fastcall MsgThread::Execute()
{
  //---- Place thread code here ----
  FreeOnTerminate = true;
  while(!Terminated)  {
    Synchronize(fsMsgDo);
    Sleep(300);
  }
}
//---------------------------------------------------------------------------
void __fastcall MsgThread::fsMsgDo(void)
{
  //你的程式
  r=Str_->Count;
  if (r)  {        // Client是否有資料進來
    TStrings *S_;  // 建立另一個TString;
    S_=new TStringList();
    S_=Str_->Strings[r-1];
    S_->Text = Str_->Strings[r-1]; // 將資料導入另一TString
    Str_->Delete(r-1);      // 清除單筆記錄
    Ip_Addr=S_->Values["IP_ADDR"];
    Ip_Port=S_->Values["IP_PORT"];
    ....
    .... 
    delete S_; // 要刪除
  }     
}
當然方法不只一種!
請參考    
Andy Chang 發表人 - andychang1690 於 2005/06/29 22:07:54
------
Andy Chang
kndd
一般會員


發表:4
回覆:8
積分:2
註冊:2004-05-05

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-06-29 21:28:57 IP:203.204.xxx.xxx 未訂閱
引言:
kndd:你可以建立Thread的方式(我建議以Thread方式)
例建立TStrings *Str_; 為全域變數,於.h檔中
private:        // User declarations
  MsgThread *msgthread; //多執行緒程式
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
extern TStrings* Str_;
//---------------------------------------------------------------------------
#endif
.Cpp檔
TForm1 *Form1;
TStrings* Str_;    void __fastcall TForm1::FormCreate(TObject *Sender)
{
  ServerSocket->Active = true ;
  Str_=new TStringList();
  msgthread = new MsgThread();
}
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
  if (msgthread) msgthread->Terminate();
  ServerSocket->Active = false ;
  delete Str_;
}
void __fastcall TForm1::ServerSocketClientRead(TObject *Sender,
      TCustomWinSocket *Socket)
{
  AnsiString S;
  S="IP_ADDR=" Socket->RemoteAddress "\r\n"; //Client的IP
  S ="IP_PORT=" IntToStr(Socket->RemotePort) "\r\n"; //Client的Port
  Str_->Add( S Socket->ReceiveText()); // 儲存至String中
}    Thread的.Cpp檔
//---------------------------------------------------------------------------    #include 
#pragma hdrstop    #include "Msg_Thread.h"
#include "Unit1.h"
#pragma package(smart_init)
//---------------------------------------------------------------------------    //   Important: Methods and properties of objects in VCL can only be
//   used in a method called using Synchronize, for example:
//
//      Synchronize(UpdateCaption);
//
//   where UpdateCaption could look like:
//
//      void __fastcall MsgThread::UpdateCaption()
//      {
//        Form1->Caption = "Updated in a thread";
//      }
//---------------------------------------------------------------------------    __fastcall MsgThread::MsgThread()
  : TThread(false)
{
}
__fastcall MsgThread::~MsgThread()
{
}
//---------------------------------------------------------------------------
void __fastcall MsgThread::Execute()
{
  //---- Place thread code here ----
  FreeOnTerminate = true;
  while(!Terminated)  {
    Synchronize(fsMsgDo);
    Sleep(300);
  }
}
//---------------------------------------------------------------------------
void __fastcall MsgThread::fsMsgDo(void)
{
  //你的程式
  r=Str_->Count;
  if (r)  {        // Client是否有資料進來
    TStrings *S_;  // 建立另一個TString;
    S_=new TStringList();
    S_=Str_->Strings[r-1];
    S_->Text = Str_->Strings[r-1]; // 將資料導入另一TString
    Str_->Delete(r-1);      // 清除單筆記錄
    Ip_Addr=Str_->Values["IP_ADDR"];
    Ip_Port=Str_->Values["IP_PORT"];
    ....
    .... 
    delete S_; // 要刪除
  }     
}
當然方法不只一種!
請參考    
Andy Chang
謝謝您的解答,我趕去緊查Thread的用法 程式真是越寫越好玩~每當寫出個功能就很有成就^^
系統時間:2024-04-29 20:44:10
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!