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

請問TListBox與Internet之TServerSocket/TClientSocket的問題

答題得分者是:gemi0305
willchen
初階會員


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

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-09-12 18:01:52 IP:211.74.xxx.xxx 未訂閱
各位先進好 小弟要寫一個Client/Server的程式,大致上為以下 Server端有兩個ListBox,一個紀錄連線端的IP,另一個紀錄連線端所擁有的檔案名稱.但小弟有個問題,因為Client端有很多檔案列表,我要怎麼寫才能一個檔案 一個檔案(逐步傳給Server讓Server一個一個存入ListBox中),Client端使用的是FindFirst與FindNext的function,還是有更好的方法可以寫,因為傳統的TServer/Client必須把程式寫在event下才能執行,還是可以不用寫在Event下就可以隨時呼叫的寫法,不過現在的問題是,我傳給Server的資料可能是一長串的AnsiString檔名,那傳到Server端利用TListBox->items->add的方法可以排好一行一行的嗎??沒寫過,不知道那個方法會是比較好的方式
willchen
初階會員


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-09-12 21:23:13 IP:211.74.xxx.xxx 未訂閱
以下是我剛剛的程式,小Try一下 ========================================== Server端  
 //---------------------------------------------------------------------------    #include 
#pragma hdrstop    #include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
 DS_Server->Port=6666;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
 DS_Server->Active=True;
}
//---------------------------------------------------------------------------    void __fastcall TForm1::DS_ServerClientRead(TObject *Sender,
      TCustomWinSocket *Socket)
{
 IPList->Items->Add(Socket->RemoteAddress);
 ServerletList->Items->Add(Socket->ReceiveText());
}
//---------------------------------------------------------------------------
===================================================================== Client端
 //---------------------------------------------------------------------------    #include 
#pragma hdrstop    #include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TSearchRec FileRec;
int Attr=faAnyFile;
TForm1 *Form1;
AnsiString CurrentDir;
AnsiString Serverletpath;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
 DS_Client->Host="127.0.0.1";//先假定內部傳輸,應該為140.116.39.126
 DS_Client->Port=6666;     char dir[128];
 GetCurrentDirectory(sizeof(dir),dir);
 CurrentDir=dir;
 Edit1->Text=Serverletpath=CurrentDir "\\..\\Serverlet\\";//Debug
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
 DS_Client->Active=True;
}
//---------------------------------------------------------------------------    void __fastcall TForm1::DS_ClientWrite(TObject *Sender,
      TCustomWinSocket *Socket)
{
 int FileFound=FindFirst(Serverletpath "*.exe",Attr,FileRec);
 while (FileFound==0)
 {
  Socket->SendText(FileRec.Name "");
  ServerletList->Items->Add(FileRec.Name);
  FileFound=FindNext(FileRec);
 }
}
//---------------------------------------------------------------------------
以上執行,基本上傳輸都不成問題,但問題卡在,Server端的Add會把Client端 找到的檔名接連的ADD在Server端的ListBox上,請問各位高手,這該如何解決, 才能讓Server端的ADD根據Client傳的檔案不同而分成兩個Item存在ListBox上
gemi0305
版主


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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-09-12 22:02:31 IP:61.224.xxx.xxx 未訂閱
你好, 我沒有去try你的程式碼, 不過我的第一直覺就是你應該在Client的程式中, Send資料之後,最好是Sleep()一下,    因為TCP/IP遇到送太快的資料,網路卡有個機制就是會一起打包再送出去, Sleep()其實只是不要讓資料連著送~ 不用到一秒好像就有效果 試試看,不行的話,再來討論~ 國泰平安
gemi0305
版主


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-09-17 14:58:27 IP:210.66.xxx.xxx 未訂閱
請問你的問題解決了嗎?    如果還沒解決的話,記得提出來哦, 不然版上其他高手會以為已經解決,就不回答了< > 如果我上篇猜錯,害你問題沒人答, 我也會很不好意思< > 國泰平安
willchen
初階會員


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-09-17 15:40:19 IP:211.74.xxx.xxx 未訂閱
我基本上已經解決了,但有時候還是會有點問題,但可能是Sleep不夠久的關係 有什麼辦法可以完全沒問題??
gemi0305
版主


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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-09-17 16:21:18 IP:210.66.xxx.xxx 未訂閱
一般我們在寫這種會連送的socket,都會用一個緩衝工具,    常用的是List加timer,先把要傳的資料一筆一筆存到list去, 再用timer一筆一筆送。    有時會用Sleep(),    有時會用ShowMessage()+自動關閉ShowMessage()程式,    這三種我都會用,但視在不同狀況的時候, 在連送資料的時候,我比較常用第一種,第二種視程式的連線情況才用, 但只要時間拿捏好,應該都沒問題,以我使用多次的經驗來看, sleep()所用的時間是會比另兩種多一點, 這些讓你參考一下~ 國泰平安
系統時間:2024-04-20 1:34:19
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!