表單累容如下:
語法:
object Form1: TForm1
Left = 267
Top = 273
Width = 226
Height = 237
Caption = 'Form1'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
object SpeedButton1: TSpeedButton
Left = 8
Top = 88
Width = 81
Height = 22
Caption = '傳送'
Flat = True
OnClick = SpeedButton1Click
end
object SpeedButton2: TSpeedButton
Left = 8
Top = 120
Width = 81
Height = 25
Caption = '放棄'
Flat = True
OnClick = SpeedButton2Click
end
object SpeedButton3: TSpeedButton
Left = 8
Top = 168
Width = 81
Height = 25
Caption = '離開'
Flat = True
OnClick = SpeedButton3Click
end
object ToolBar1: TToolBar
Left = 0
Top = 0
Width = 218
Height = 29
ButtonHeight = 21
ButtonWidth = 31
Caption = 'ToolBar1'
Flat = True
ShowCaptions = True
TabOrder = 0
object ToolButton1: TToolButton
Left = 0
Top = 0
Caption = '連線'
DropdownMenu = PopupMenu1
ImageIndex = 0
end
end
object Edit1: TEdit
Left = 8
Top = 40
Width = 81
Height = 40
Font.Charset = CHINESEBIG5_CHARSET
Font.Color = clWindowText
Font.Height = -32
Font.Name = 'Fixedsys'
Font.Style = []
MaxLength = 4
ParentFont = False
TabOrder = 1
end
object Memo1: TMemo
Left = 96
Top = 40
Width = 113
Height = 153
TabOrder = 2
end
object ServerSocket1: TServerSocket
Active = False
Port = 1234
ServerType = stNonBlocking
OnClientConnect = ServerSocket1ClientConnect
OnClientDisconnect = ServerSocket1ClientDisconnect
OnClientRead = ServerSocket1ClientRead
Left = 40
Top = 104
end
object ClientSocket1: TClientSocket
Active = False
ClientType = ctNonBlocking
Port = 1234
OnConnect = ClientSocket1Connect
OnDisconnect = ClientSocket1Disconnect
OnRead = ClientSocket1Read
Left = 72
Top = 104
end
object PopupMenu1: TPopupMenu
Left = 104
Top = 104
object N1: TMenuItem
Caption = '等待連線'
OnClick = N1Click
end
object N2: TMenuItem
Caption = '加入連線'
OnClick = N2Click
end
end
end
首先先討論如何利用Builder的TServerSocket與TClientSocket物件來透過網路傳輸資料
TServerSocket是屬於主機端的物件,也就是他是
等待連結
TClientSocket則是屬於用戶端的物件,就是
主動連結主機
接著有另外一項重要屬性就是Port,據書面資料說Port值可以任意,但必須大於1024,而兩台相連的電腦,Port值一定要一樣
使用時,其中一端必須當作主機(就是使用TServerSocket),等待TClientSocket的訊息,另一台電腦則使用TClientSocket發出訊息給主機
首先讓使用者選擇是要當主機(使用TServerSocket等待他人加入)呢?還是要加入其中一台主機(使用TClientSocket)
至於連接時您可以選擇使用IP(Address)或是輸入對方電腦名稱(Host)
本程式是兩個都放入,然後由使用者選擇要當Server會Client
若是當Server(選擇等待連結)則直接將ServerSocket1的Active屬性設為true,就可以等候Client的訊息了
語法:
void __fastcall TForm1::N1Click(TObject *Sender)
{
ServerSocket1->Active=true;
}
//---------------------------------------------------------------------------
若是當Client(選擇加入連結)則先輸入連結的電腦名稱,再將ClientSocket1的Active屬性設為true;
語法:
void __fastcall TForm1::N2Click(TObject *Sender)
{
String sh;
if(InputQuery("連線","輸入 電腦名稱: ",sh));
if(sh.Length()>0)
{
ClientSocket1->Host=sh;
ClientSocket1->Active=true;
}
}
//---------------------------------------------------------------------------
當雙方都連線時,在Server端的TServerSocket會觸發OnClientConnect事件
語法:
void __fastcall TForm1::ServerSocket1ClientConnect(TObject *Sender,
TCustomWinSocket *Socket)
{
Memo1->Lines->Add(Socket->RemoteHost+"上來!");
ToolButton1->Enabled=false;
}
//---------------------------------------------------------------------------
而Client端也會觸發OnConnect事件
語法:
void __fastcall TForm1::ClientSocket1Connect(TObject *Sender,
TCustomWinSocket *Socket)
{
Memo1->Lines->Add("連到"+Socket->RemoteHost);
ToolButton1->Enabled=false;
}
//---------------------------------------------------------------------------
接下來是傳送資料
在TServerSocket是以ServerSocket1->Socket->Connections[0]->
SendText(Edit1->Text)方法傳送的
而TClientSocket則以ClientSocket1->Socket->
SendText(Edit1->Text)傳送
所以傳送按鈕(SpeedButton1)的OnClick事件是:
語法:
void __fastcall TForm1::SpeedButton1Click(TObject *Sender)
{
if(ServerSocket1->Active)
ServerSocket1->Socket->Connections[0]->SendText(Edit1->Text);
else
ClientSocket1->Socket->SendText(Edit1->Text);
}
//---------------------------------------------------------------------------
在資料接收事件TServerSocket的觸發事件是OnClientRead
語法:
void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender,
TCustomWinSocket *Socket)
{
Memo1->Lines->Add(Socket->ReceiveText());
}
//---------------------------------------------------------------------------
TClientSocket則為OnRead
語法:
void __fastcall TForm1::ClientSocket1Read(TObject *Sender,
TCustomWinSocket *Socket)
{
Memo1->Lines->Add(Socket->ReceiveText());
}
//---------------------------------------------------------------------------
而離線按鈕(SpeedButton2)是將Active設為false,OnClick事件是:
語法:
void __fastcall TForm1::SpeedButton2Click(TObject *Sender)
{
if(ServerSocket1->Active)
ServerSocket1->Active=false;
else
ClientSocket1->Active=false;
ToolButton1->Enabled=true;
}
//---------------------------------------------------------------------------
同樣的離線時TServerSocket與TClientSocket都會收到一個事件
TServerSocket的事件是OnClientDisconnect
語法:
void __fastcall TForm1::ServerSocket1ClientDisconnect(TObject *Sender,
TCustomWinSocket *Socket)
{
Memo1->Lines->Add(Socket->RemoteHost+"離線");
ToolButton1->Enabled=true;
}
//---------------------------------------------------------------------------
TClientSocket的事件是OnDisconnect
語法:
void __fastcall TForm1::ClientSocket1Disconnect(TObject *Sender,
TCustomWinSocket *Socket)
{
Memo1->Lines->Add(Socket->RemoteHost+"離線");
ToolButton1->Enabled=true;
}
//---------------------------------------------------------------------------
最後若離開時,將TServerSocket與TClientSocket關閉在離開
語法:
void __fastcall TForm1::SpeedButton3Click(TObject *Sender)
{
ServerSocket1->Close();
ClientSocket1->Close();
Close();
}
//---------------------------------------------------------------------------
今天先介紹連線元件,下次在加入之前的程式碼
<敬請指教>