?? u_main.pas
字號:
unit u_main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Sockets, jpeg, ExtCtrls, Buttons;
type
Tf_main = class(TForm)
m_send: TMemo;
TcpClient1: TTcpClient;
m_Recv: TMemo;
TcpServer1: TTcpServer;
GroupBox1: TGroupBox;
Image2: TImage;
b_send: TBitBtn;
b_clear: TBitBtn;
Image1: TImage;
GroupBox4: TGroupBox;
Label1: TLabel;
e_remoteHost: TEdit;
Label2: TLabel;
e_remotePort: TEdit;
GroupBox5: TGroupBox;
e_localPort: TEdit;
GroupBox6: TGroupBox;
l_clientName: TListBox;
b_remoteServ: TBitBtn;
b_rocalServ: TBitBtn;
Label3: TLabel;
l_clientPort: TListBox;
procedure b_sendClick(Sender: TObject);
procedure TcpServer1Accept(Sender: TObject;
ClientSocket: TCustomIpClient);
procedure b_clearClick(Sender: TObject);
procedure l_clientNameDblClick(Sender: TObject);
procedure b_remoteServClick(Sender: TObject);
procedure b_rocalServClick(Sender: TObject);
procedure l_clientPortDblClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
TClientThread = class(TThread) //線程類
private
public
ListBuffer : TStringList;
TargetList : TStrings;
procedure synchAddDataToControl;
constructor Create(CreatSuspended: Boolean);
procedure Execute;override;
procedure Terminate;
end;
var
f_main: Tf_main;
implementation
{$R *.dfm}
{線程類TClientThread的構造函數}
constructor TClientThread.Create(CreatSuspended: Boolean);
begin
inherited Create(CreatSuspended);
FreeOnTerminate := true;
ListBuffer := TStringList.Create;
end;
{線程類TClientThread的結束函數}
procedure TClientThread.Terminate;
begin
ListBuffer.Free;
inherited;
end;
{線程類TClientThread的執行函數}
procedure TClientThread.Execute;
begin
Synchronize(synchAddDataToControl);
end;
{線程類TClientThread的同步函數:把數據從緩沖區發送到TargetList的控件中}
procedure TClientThread.synchAddDataToControl;
begin
TargetList.AddStrings(ListBuffer);
end;
{發送信息}
procedure Tf_main.b_sendClick(Sender: TObject);
var
i:Integer;
begin
TcpClient1.RemoteHost := e_remoteHost.Text;
TcpClient1.RemotePort := e_remotePort.Text;
try
if TcpClient1.Connect then
begin
for i:= 0 to m_send.Lines.Count-1 do
begin
TcpClient1.Sendln(m_send.Lines[i]);
m_recv.Lines.Append('^_^本地客戶機:localhost(127.0.0.1)');
m_recv.Lines.Append('<<<<<信息開始');
m_recv.Lines.Append(m_send.Lines[i]);
m_recv.Lines.Append('>>>>>信息結束');
end;
end
else
begin
m_recv.Lines.Append('無法發送:還沒有連接好友!');
m_recv.Lines.Append('請先連接一個好友,有兩種方式:');
m_recv.Lines.Append('1:在好友列表中雙擊某個好友名單');
m_recv.Lines.Append('2:在遠程服務器中填寫好友的主機和端口號,點擊 連接 即可');
end;
finally
TcpClient1.Disconnect;
end;
end;
{服務器控件開始接收信息,顯示出來}
procedure Tf_main.TcpServer1Accept(Sender: TObject;
ClientSocket: TCustomIpClient);
var
s:string;
clientThread : TClientThread;
begin
clientThread := TClientThread.Create(true);
clientThread.TargetList := m_recv.Lines;
clientThread.ListBuffer.Add('接收連接');
clientThread.ListBuffer.Add('^_^遠程客戶機 : ' + ClientSocket.LookupHostName(ClientSocket.RemoteHost)
+ '(' + ClientSocket.RemoteHost + ')' );
clientThread.ListBuffer.Add('<<<<<信息開始');
s := ClientSocket.Receiveln;
while s<>'' do
begin
clientThread.ListBuffer.Add(s);
s := ClientSocket.Receiveln;
end;
clientThread.ListBuffer.Add('>>>>>信息結束');
clientThread.Resume;
end;
{清空}
procedure Tf_main.b_clearClick(Sender: TObject);
begin
m_send.Lines.Clear;
end;
{TcpClient1連接遠程服務器}
procedure Tf_main.l_clientNameDblClick(Sender: TObject);
var
i:integer;
begin
i := 0 ;
while ( i< l_clientName.Count) do
begin
if l_clientName.Selected[i] then//找到被選中的好友
begin
try
TcpClient1.RemoteHost := l_clientName.Items.Strings[i];
TcpClient1.RemotePort := l_clientPort.Items.Strings[i];
e_remoteHost.Text := TcpClient1.RemoteHost;
e_remotePort.Text := TcpClient1.RemotePort;
if TcpClient1.Connect then //連接
begin
m_recv.Lines.Append('成功:已經連接');
break;
end;
finally
TcpClient1.Disconnect;
end;
end;
i := i+1;
end;
end;
{TcpClient1連接遠程服務器}
procedure Tf_main.b_remoteServClick(Sender: TObject);
var
i:integer;
begin
TcpClient1.RemoteHost := e_remoteHost.Text;
TcpClient1.RemotePort := e_remotePort.Text;
try
if TcpClient1.Connect then //連接
begin
//查詢好友在列表中的索引
i := l_clientName.Items.IndexOf(e_remotehost.Text);
if (i<0) then //如果找不到,添加到列表中
begin
l_clientName.Items.Append(e_remotehost.Text);
l_clientport.Items.Append(e_remoteport.Text);
m_recv.Lines.Append('已經添加新好友到列表中');
end
else //已經存在
m_recv.Lines.Append('該好友已經存在于列表中');
end;
finally
TcpClient1.Disconnect;
end ;
end;
{啟動TcpServer1進行偵聽}
procedure Tf_main.b_rocalServClick(Sender: TObject);
begin
TcpServer1.LocalPort := e_localPort.Text;
TcpServer1.Open;
TcpServer1.Active := True;
m_recv.Lines.Append('本地服務器開始啟動偵聽');
end;
{TcpClient1連接遠程服務器}
procedure Tf_main.l_clientPortDblClick(Sender: TObject);
var
i:integer;
begin
i := 0 ;
while ( i< l_clientPort.Count) do
begin
if l_clientPort.Selected[i] then//找到被選中的好友
begin
try
TcpClient1.RemoteHost := l_clientName.Items.Strings[i];
TcpClient1.RemotePort := l_clientPort.Items.Strings[i];
e_remoteHost.Text := TcpClient1.RemoteHost;
e_remotePort.Text := TcpClient1.RemotePort;
if TcpClient1.Connect then //連接
begin
m_recv.Lines.Append('成功:已經連接');
break;
end;
finally
TcpClient1.Disconnect;
end;
end;
i := i+1;
end;
end;
end.
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -