用来查询端口连接数的线程,只执行一个线程时能获取最后结果,但是同时执行2个就不行了
提供完整代码,复制即可用,还请高手分析分析,80分求教。线程代码:
unit Telnets;interfaceuses Windows, Classes, SysUtils, IdTelnet , StrUtils, StdCtrls, Messages, ActiveX;type
TTelnetThread = class(TThread)
private
{ Private declarations }
procedure SendCommand(Command: string);
procedure Connect;
procedure LoginDataAvailable(Sender: TIdTelnet; const Buffer: String);
procedure GetOLDataAvailable(Sender: TIdTelnet; const Buffer: String);
protected
procedure Execute; override;
public
constructor Create(HostB:string; PortAB:Integer; PortBB:Integer; EditB:TEdit);
end;var
Telnet : TIdTelnet;
OlTemp,OlCount : TStringList;
EditA : TEdit;
HostA : string;
PortAA , PortBA: Integer;
implementationconstructor TTelnetThread.Create(HostB:string; PortAB:Integer; PortBB:Integer; EditB:TEdit);
begin
FreeOnTerminate := True;
inherited Create(False);
HostA := HostB;
PortAA := PortAB;
PortBA := PortBB;
EditA := EditB;
end;procedure TTelnetThread.Execute;
begin
FreeOnTerminate := True;
CoInitialize(nil); Telnet := TIdTelnet.Create(nil);
Telnet.OnDataAvailable := LoginDataAvailable; EditA.Text := 'Getting...'; OlTemp := TStringList.Create;
OlCount := TStringList.Create;
Connect;
end;procedure TTelnetThread.SendCommand(Command: string);
var
i : integer;
begin
// OlTemp.Add(Command);
// MessageBox(0,PChar(OlTemp.Text),'标题',MB_OK);
if Telnet.Connected then
begin
for i := 1 to length(Command) do
Telnet.SendCh(Command[i]);
Telnet.SendCh(#13);
end;
end;procedure TTelnetThread.Connect;
begin
Telnet.Host:=HostA;
Telnet.Port:=PortAA;
Telnet.Connect;
end;procedure TTelnetThread.LoginDataAvailable(Sender: TIdTelnet; const Buffer: String);
const
CR = #13;
LF = #10;
var
Start, Stop : Integer;
begin
Start := 1;
Stop := Pos(CR, Buffer);
if Stop = 0 then
Stop := Length(Buffer) + 1;
while Start <= Length(Buffer) do begin
if Copy(Buffer, Start, Stop - Start) = 'login: ' then
begin
SendCommand('administrator');
end;
if Copy(Buffer, Start, Stop - Start) = 'password: ' then
begin
SendCommand('password#');
end;
if Copy(Buffer, Start, Stop - Start) = 'C:\Users\Administrator>' then
begin
Telnet.OnDataAvailable := GetOLDataAvailable;
OlTemp.Clear;
OlCount.Clear;
SendCommand('netstat -an -p TCP | find "'+IntToStr(PortBA)+'"');
end; Start := Stop + 1;
if Start > Length(Buffer) then
Break;
if Buffer[Start] = LF then
Start := Start + 1;
Stop := Start;
while (Buffer[Stop] <> CR) and (Stop <= Length(Buffer)) do
Stop := Stop + 1;
end;
end;procedure TTelnetThread.GetOLDataAvailable(Sender: TIdTelnet; const Buffer: String);
const
CR = #13;
LF = #10;
var
Start, Stop, i: Integer;
begin
if OlTemp.Count = 0 then
OlTemp.Add('');
Start := 1;
Stop := Pos(CR, Buffer);
if Stop = 0 then
Stop := Length(Buffer) + 1;
while Start <= Length(Buffer) do begin
OlTemp.Strings[OlTemp.Count - 1] :=
OlTemp.Strings[OlTemp.Count - 1] +
Copy(Buffer, Start, Stop - Start); if Copy(Buffer, Start, Stop - Start) = 'C:\Users\Administrator>' then
begin
for i := 0 to OlTemp.Count - 1 do
begin
if AnsiContainsText(OlTemp.Strings[i], 'ESTABLISHED') then
OlCount.Add(OlTemp.Strings[i]);
end;
EditA.Text:=IntToStr(OlCount.Count);
SendCommand('Exit');
end; if Buffer[Stop] = CR then begin
OlTemp.Add('');
end;
Start := Stop + 1;
if Start > Length(Buffer) then
Break;
if Buffer[Start] = LF then
Start := Start + 1;
Stop := Start;
while (Buffer[Stop] <> CR) and (Stop <= Length(Buffer)) do
Stop := Stop + 1;
end;
end;
end.
调用代码unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Button2: TButton;
Edit2: TEdit;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementationuses Telnets;{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
var
thread1:TTelnetThread;
begin
thread1:=TTelnetThread.Create('172.16.3.100',23,9980,Edit1);end;procedure TForm1.Button2Click(Sender: TObject);
var
thread2:TTelnetThread;
begin
thread2:=TTelnetThread.Create('172.16.3.200',23,9980,Edit2);
end;end.
提供完整代码,复制即可用,还请高手分析分析,80分求教。线程代码:
unit Telnets;interfaceuses Windows, Classes, SysUtils, IdTelnet , StrUtils, StdCtrls, Messages, ActiveX;type
TTelnetThread = class(TThread)
private
{ Private declarations }
procedure SendCommand(Command: string);
procedure Connect;
procedure LoginDataAvailable(Sender: TIdTelnet; const Buffer: String);
procedure GetOLDataAvailable(Sender: TIdTelnet; const Buffer: String);
protected
procedure Execute; override;
public
constructor Create(HostB:string; PortAB:Integer; PortBB:Integer; EditB:TEdit);
end;var
Telnet : TIdTelnet;
OlTemp,OlCount : TStringList;
EditA : TEdit;
HostA : string;
PortAA , PortBA: Integer;
implementationconstructor TTelnetThread.Create(HostB:string; PortAB:Integer; PortBB:Integer; EditB:TEdit);
begin
FreeOnTerminate := True;
inherited Create(False);
HostA := HostB;
PortAA := PortAB;
PortBA := PortBB;
EditA := EditB;
end;procedure TTelnetThread.Execute;
begin
FreeOnTerminate := True;
CoInitialize(nil); Telnet := TIdTelnet.Create(nil);
Telnet.OnDataAvailable := LoginDataAvailable; EditA.Text := 'Getting...'; OlTemp := TStringList.Create;
OlCount := TStringList.Create;
Connect;
end;procedure TTelnetThread.SendCommand(Command: string);
var
i : integer;
begin
// OlTemp.Add(Command);
// MessageBox(0,PChar(OlTemp.Text),'标题',MB_OK);
if Telnet.Connected then
begin
for i := 1 to length(Command) do
Telnet.SendCh(Command[i]);
Telnet.SendCh(#13);
end;
end;procedure TTelnetThread.Connect;
begin
Telnet.Host:=HostA;
Telnet.Port:=PortAA;
Telnet.Connect;
end;procedure TTelnetThread.LoginDataAvailable(Sender: TIdTelnet; const Buffer: String);
const
CR = #13;
LF = #10;
var
Start, Stop : Integer;
begin
Start := 1;
Stop := Pos(CR, Buffer);
if Stop = 0 then
Stop := Length(Buffer) + 1;
while Start <= Length(Buffer) do begin
if Copy(Buffer, Start, Stop - Start) = 'login: ' then
begin
SendCommand('administrator');
end;
if Copy(Buffer, Start, Stop - Start) = 'password: ' then
begin
SendCommand('password#');
end;
if Copy(Buffer, Start, Stop - Start) = 'C:\Users\Administrator>' then
begin
Telnet.OnDataAvailable := GetOLDataAvailable;
OlTemp.Clear;
OlCount.Clear;
SendCommand('netstat -an -p TCP | find "'+IntToStr(PortBA)+'"');
end; Start := Stop + 1;
if Start > Length(Buffer) then
Break;
if Buffer[Start] = LF then
Start := Start + 1;
Stop := Start;
while (Buffer[Stop] <> CR) and (Stop <= Length(Buffer)) do
Stop := Stop + 1;
end;
end;procedure TTelnetThread.GetOLDataAvailable(Sender: TIdTelnet; const Buffer: String);
const
CR = #13;
LF = #10;
var
Start, Stop, i: Integer;
begin
if OlTemp.Count = 0 then
OlTemp.Add('');
Start := 1;
Stop := Pos(CR, Buffer);
if Stop = 0 then
Stop := Length(Buffer) + 1;
while Start <= Length(Buffer) do begin
OlTemp.Strings[OlTemp.Count - 1] :=
OlTemp.Strings[OlTemp.Count - 1] +
Copy(Buffer, Start, Stop - Start); if Copy(Buffer, Start, Stop - Start) = 'C:\Users\Administrator>' then
begin
for i := 0 to OlTemp.Count - 1 do
begin
if AnsiContainsText(OlTemp.Strings[i], 'ESTABLISHED') then
OlCount.Add(OlTemp.Strings[i]);
end;
EditA.Text:=IntToStr(OlCount.Count);
SendCommand('Exit');
end; if Buffer[Stop] = CR then begin
OlTemp.Add('');
end;
Start := Stop + 1;
if Start > Length(Buffer) then
Break;
if Buffer[Start] = LF then
Start := Start + 1;
Stop := Start;
while (Buffer[Stop] <> CR) and (Stop <= Length(Buffer)) do
Stop := Stop + 1;
end;
end;
end.
调用代码unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Button2: TButton;
Edit2: TEdit;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementationuses Telnets;{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
var
thread1:TTelnetThread;
begin
thread1:=TTelnetThread.Create('172.16.3.100',23,9980,Edit1);end;procedure TForm1.Button2Click(Sender: TObject);
var
thread2:TTelnetThread;
begin
thread2:=TTelnetThread.Create('172.16.3.200',23,9980,Edit2);
end;end.
解决方案 »
- 一个简单的
- 请教sql语句
- 记时器代码问题,高手帮忙看一下.
- 一个message后,出现一个窗体。我想写个程序发送消息给那个对话框。
- 我想請問一下: 有沒有哪個函數可以知道一個文本文檔一共有多少行?? 多謝了!!!
- 关于串口通信,请高手指教
- 很久没摸java了,特怀念,目前到了专题开发版,更没有机会来了!散分!
- 懂得注册表、热心的高手请帮忙!!(dll注册问题)
- 帮帮我吧~~~~~~~~My God!!!!!!我不得已而为之啊~~~急急急急急急急!!!
- ****有关Sql Server的错误处理?***
- delphixe 里关于advstringrid,无法使用中键滚轮滚动的问题
- 登陆游戏画面时,找到的是后面画面的颜色,怎么才能找到登陆画面的?
Telnet : TIdTelnet;
OlTemp,OlCount : TStringList;
EditA : TEdit;
HostA : string;
PortAA , PortBA: Integer;
应该放到线程类里面吧
Telnet : TIdTelnet;
OlTemp,OlCount : TStringList;
EditA : TEdit;
HostA : string;
PortAA , PortBA: Integer;
需要放到线程里,另外不能直接在线程中访问VCL。