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

IdTCPServer和IdTCPClient的問題

答題得分者是:sryang
pchw8598
一般會員


發表:43
回覆:63
積分:21
註冊:2003-11-09

發送簡訊給我
#1 引用回覆 回覆 發表時間:2013-03-09 00:17:34 IP:112.104.xxx.xxx 訂閱
  各位好我剛由BCB6轉移到XE3,很多VCL原件用起來都怪怪的不上手,以下簡單的Server-Client程式碼就很奇怪,請大家幫幫忙,謝謝.
Server和Client都啟動後:
問題1. Client連上了Server之後,再由Client斷線, 然後就再也連不上Server了
問題2. Client連線時,關閉Server,Server就當了
程式碼如下(不好意思,我不會貼程式):

Server端:
//---------------------------------------------------------------------------
#include
#pragma hdrstop
#include "Server.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
bool fgActive; //伺服器是否啟動
int ServerPort; //連接埠
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
{
return;
{
return;
: TForm(Owner)
{
fgConnected=false;
StatusBar1->Panels->Items[0]->Text="未連接伺服器";
Edit1->Text=IdIPWatch1->LocalIP();
ServerIP=Edit1->Text;
ServerPort=StrToInt(Edit2->Text);
fgConnected=false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
if(fgConnected)
{
return;
{
IdTCPClient1->Host=ServerIP;
IdTCPClient1->Port=ServerPort;
}
catch(...)
{
ShowMessage("無法與伺服器連線");
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::IdTCPClient1Connected(TObject *Sender)
{
Memo1->Lines->Add("已連上伺服器");
fgConnected=true;
StatusBar1->Panels->Items[0]->Text="已連線";
Memo1->Lines->Add(IdTCPClient1->IOHandler->ReadLn());
}
//---------------------------------------------------------------------------
void __fastcall TForm1::IdTCPClient1Disconnected(TObject *Sender)
{
Memo1->Lines->Add("伺服器已斷線");
fgConnected=false;
StatusBar1->Panels->Items[0]->Text="未連線";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
if(!fgConnected)
ShowMessage("尚未連線");
return;
}
IdTCPClient1->Disconnect();
Memo1->Lines->Add("Client斷線," Time() "," Date());
StatusBar1->Panels->Items[0]->Text="伺服器已斷線";
fgConnected=false;
}
//---------------------------------------------------------------------------
sryang
尊榮會員


發表:39
回覆:762
積分:920
註冊:2002-06-27

發送簡訊給我
#2 引用回覆 回覆 發表時間:2013-03-09 08:22:59 IP:114.35.xxx.xxx 訂閱
剛好前陣子遇過類似的問題

IdTCPServer1Execute 事件處理裡面要加一行


AContext->Connection->Socket->ReadLn();

讓 Server 開始等待 Client 送東西過來

------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/
pchw8598
一般會員


發表:43
回覆:63
積分:21
註冊:2003-11-09

發送簡訊給我
#3 引用回覆 回覆 發表時間:2013-03-09 10:00:37 IP:112.104.xxx.xxx 訂閱
太感謝了, 解決的無法重複連上server的問題了.
現在只剩下在client端連線的狀態時,關閉server時會讓server的程式沒有反應,好像當掉了, 請問不知道程式的哪裡出問題了?
謝謝


pchw8598
一般會員


發表:43
回覆:63
積分:21
註冊:2003-11-09

發送簡訊給我
#4 引用回覆 回覆 發表時間:2013-07-20 11:26:43 IP:1.167.xxx.xxx 訂閱
 感謝sryang的回覆, 現在只剩下一個問題:
當server和client互相連著的時候, server自行斷線(就是 avtive設為false) 時, server 程式就當了, 附上程式原始碼,
還請各位大大幫忙~謝謝.

Server:
//---------------------------------------------------------------------------
#include
#pragma hdrstop
#include "Server.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
{
return;
{
return;
for (int index = 0; index < List->Count; index ) {
}
}
__finally
{
: TForm(Owner)
{
fgConnected=false;
StatusBar1->Panels->Items[0]->Text="未連接伺服器";
Edit1->Text=IdIPWatch1->LocalIP();
ServerIP=Edit1->Text;
ServerPort=StrToInt(Edit2->Text);
fgConnected=false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
if(fgConnected)
{
return;
{
IdTCPClient1->Host=ServerIP;
IdTCPClient1->Port=ServerPort;
}
catch(...)
{
ShowMessage("無法與伺服器連線");
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::IdTCPClient1Connected(TObject *Sender)
{
Memo1->Lines->Add("已連上伺服器");
fgConnected=true;
StatusBar1->Panels->Items[0]->Text="已連線";
Memo1->Lines->Add(IdTCPClient1->IOHandler->ReadLn());
}
//---------------------------------------------------------------------------
void __fastcall TForm1::IdTCPClient1Disconnected(TObject *Sender)
{
Memo1->Lines->Add("伺服器已斷線");
fgConnected=false;
StatusBar1->Panels->Items[0]->Text="未連線";
IdTCPClient1->Disconnect();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
if(!fgConnected)
ShowMessage("尚未連線");
return;
}
IdTCPClient1->Disconnect();
Memo1->Lines->Add("Client斷線," Time() "," Date());
StatusBar1->Panels->Items[0]->Text="伺服器已斷線";
fgConnected=false;
}
//---------------------------------------------------------------------------

編輯記錄
pchw8598 重新編輯於 2013-07-20 11:27:47, 註解 無‧
pchw8598 重新編輯於 2013-07-20 11:28:09, 註解 無‧
pchw8598 重新編輯於 2013-07-20 11:32:43, 註解 無‧
aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#5 引用回覆 回覆 發表時間:2013-07-20 22:38:54 IP:114.44.xxx.xxx 訂閱
已從你之前的程式碼做一些調整後,分享出來,網址如下:

http://delphi.ktop.com.tw/board.php?cid=31&fid=79&tid=105340

請自行下載、研究!


蕭沖
------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
pchw8598
一般會員


發表:43
回覆:63
積分:21
註冊:2003-11-09

發送簡訊給我
#6 引用回覆 回覆 發表時間:2013-07-20 22:57:19 IP:112.104.xxx.xxx 訂閱
嗚~~~我真的是太感謝你了~~~這個問題卡了我好久~~~~
pchw8598
一般會員


發表:43
回覆:63
積分:21
註冊:2003-11-09

發送簡訊給我
#7 引用回覆 回覆 發表時間:2013-07-23 22:02:41 IP:112.104.xxx.xxx 訂閱
 aftcast和sryang兩位大大都給我很好的建議,也很實用,另一個相關問題我已經結給了atfcast大大了,所已這個問題我就結給sryang大大了.
系統時間:2024-04-19 3:04:12
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!