這是網上下載的代碼,功能是可用的,通訊沒有問題。

我要實作的效果是:客戶端獲取服務端每個Edit里的內容。
服務端代碼
unit Server_Indy;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, IdBaseComponent, IdComponent, IdTCPServer, ComCtrls, Buttons,
StdCtrls, IdAntiFreezeBase, IdAntiFreeze,IniFiles;
type
TForm1 = class(TForm)
GroupBox1: TGroupBox;
Label2: TLabel;
PortEdit: TEdit;
startbtn: TButton;
endbtn: TButton;
Label3: TLabel;
IdTCPServer1: TIdTCPServer;
IdAntiFreeze1: TIdAntiFreeze;
StatusBar1: TStatusBar;
Label1: TLabel;
Label4: TLabel;
Edit1: TEdit;
Edit2: TEdit;
GroupBox2: TGroupBox;
Memo1: TMemo;
Edit3: TEdit;
Label5: TLabel;
Edit4: TEdit;
Label6: TLabel;
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure startbtnClick(Sender: TObject);
procedure endbtnClick(Sender: TObject);
procedure IdTCPServer1Connect(AThread: TIdPeerThread);
procedure IdTCPServer1Execute(AThread: TIdPeerThread);
procedure IdTCPServer1Disconnect(AThread: TIdPeerThread);
procedure IdTCPServer1ListenException(AThread: TIdListenerThread;
AException: Exception);
private
{ Private declarations }
public
procedure AddChat;
{ procedure DisPlayChat; }
end;
var
Form1:TForm1;
chatStr:string;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
Var
IniFile:TInifile;
begin
IniFile:=TIniFile.Create(ExtractFilePath(Paramstr(0)) + 'Connect.ini');
PortEdit.Text:=IniFile.ReadString('Option','Dbprot','8198');
Edit3.Text:=IniFile.ReadString('Option','DbServer','計算機');
Edit1.Text:=IniFile.ReadString('Option','DbName','資料庫');
Edit2.Text:=IniFile.ReadString('Option','DbA','SA');
Edit4.Text:=IniFile.ReadString('Option','DbPw','密碼');
IdTcpServer1.Active:=False;
startbtn.Enabled:=True;
endbtn.Enabled:=False;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
IdTcpServer1.Active:=False;
end;
procedure TForm1.startbtnClick(Sender: TObject);
begin
with IdTcpServer1 do
begin
Bindings.Clear;
Bindings.Add.IP:='127.0.0.1';
Bindings.Add.Port:=StrToInt(portEdit.Text);
Active:=True;
endbtn.Enabled:=True;
startbtn.Enabled:=false;
Memo1.Lines.Text:='+++++服務已啟動!++++++Ariel';
end;
end;
procedure TForm1.endbtnClick(Sender: TObject);
begin
IdTcpServer1.Active:=False;
endbtn.Enabled:=False;
startbtn.Enabled:=True;
Memo1.Lines.Text :='+++++++++服務已停止!++++++Ariel';
end;
procedure TForm1.IdTCPServer1Connect(AThread: TIdPeerThread);
begin
Memo1.Lines.Text:='來自主機'+AThread.Connection.Socket.Binding.PeerIP+ '的連接請求已被接納';
AThread.Connection.WriteLn('Ariel:歡迎連接本服務器,竭誠為您服務');
end;
procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
var chat:string;
begin
with AThread.Connection do
begin
chat:=ReadLn();
chatStr:=chat+'來自于主機'+AThread.Connection.Socket.Binding.PeerIP;
AThread.Synchronize(AddChat);
{ AThread.Synchronize(DisPlayChat); }
end;
end;
procedure TForm1.AddChat();
begin
Memo1.Lines.Add(chatStr);
end;
{procedure TForm1.DisPlayChat();
begin
chatReceived:=sendEdit.Text;
end; }
procedure TForm1.IdTCPServer1Disconnect(AThread: TIdPeerThread);
begin
Memo1.Lines.Text:='來自主機'+AThread.Connection.Socket.Binding.PeerIP+'已斷開連接';
StatusBar1.Panels[0].Text:='連接已斷開';
end;
procedure TForm1.IdTCPServer1ListenException(AThread: TIdListenerThread;
AException: Exception);
begin
StatusBar1.Panels[1].Text:='正在連接.....';
end;
end.
///////////////////////////////////////////////////////////////////////////////////
客戶端代碼
unit client_indy;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
Buttons, StdCtrls;
type
TForm1 = class(TForm)
GroupBox1: TGroupBox;
Label1: TLabel;
IPEdit: TEdit;
Label2: TLabel;
portEdit: TEdit;
linkbtn: TButton;
breakbtn: TButton;
Memo1: TMemo;
sendEdit: TEdit;
sendbtn: TButton;
BitBtn1: TBitBtn;
IdTCPClient1: TIdTCPClient;
procedure FormCreate(Sender: TObject);
procedure linkbtnClick(Sender: TObject);
procedure sendbtnClick(Sender: TObject);
procedure breakbtnClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
linkbtn.Enabled:=True;
breakbtn.Enabled:=False;
sendbtn.Enabled:=False;
end;
procedure TForm1.linkbtnClick(Sender: TObject);
begin
IdTcpClient1.Host:=IPEdit.Text;
IdTcpClient1.Port:=StrToInt(portEdit.Text);
Memo1.Lines.Add('正在連接...');
with IdTcpClient1 do
begin
try
Connect();
try
Memo1.Lines.Add(ReadLn());
linkbtn.Enabled:=False;
breakbtn.Enabled:=True;
sendbtn.Enabled:=True;
except
Memo1.Lines.Add('遠程主機無回應');
IdTcpClient1.Disconnect();
end;
except
Memo1.Lines.Add('無法建立連接');
end;
end;
end;
procedure TForm1.sendbtnClick(Sender: TObject);
begin
Memo1.Lines.Add('DATA'+sendEdit.Text);
with IdTcpClient1 do
begin
try
WriteLn('DATA'+sendEdit.Text);
Memo1.Lines.Add(ReadLn())
except
Memo1.Lines.Add('發送資料失敗');
IdTcpClient1.Disconnect();
Memo1.Lines.Add('同主機連接已斷開');
end;
end;
end;
procedure TForm1.breakbtnClick(Sender: TObject);
begin
Memo1.Lines.Add('QUIT');
try
IdTcpClient1.writeLn('QUIT');
finally
IdTcpClient1.Disconnect();
Memo1.Lines.Add('同主機的連接已經斷開');
breakbtn.Enabled:=False;
linkbtn.Enabled:=True;
sendbtn.Enabled:=False;
end;
end;
end.
uj5u.com熱心網友回復:
客戶端發一個請求讓服務端回傳資料就可以了:服務端修改
procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
var chat:string;
begin
with AThread.Connection do
begin
chat:=ReadLn();
if Copy(chat, 1, Length(chat) - 4) = 'info' then
AThread.Connection.WriteLn(Format('Port=%s, Service=%s', [Edit1.Text, Edit2.Text])); // 其他你自己加上
chatStr:=chat+'來自于主機'+AThread.Connection.Socket.Binding.PeerIP;
AThread.Synchronize(AddChat);
{ AThread.Synchronize(DisPlayChat); }
end;
end;
客戶端代碼不用修改
在客戶端輸入info,然后發送,服務端就能回傳資料了
uj5u.com熱心網友回復:
有一點錯誤,應該是:if Copy(chat, 5, Length(chat) - 4) = 'info' then
AThread.Connection.WriteLn(Format('Port=%s, Service=%s', [Edit1.Text, Edit2.Text])); // 其他你自己加上
uj5u.com熱心網友回復:

如果是socket我會弄 這個不熟悉,應該是差不多的。
客戶端在發送資訊給服務端。服務端檢查收到的資訊進行反饋發送~
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/260794.html
標籤:網絡通信/分布式開發
