15.10.2010, 23:51
|
Прохожий
|
|
Регистрация: 08.11.2009
Сообщения: 3
Репутация: 10
|
|
Проблемы при работе с Indy
Всем привет в общем как с помощью Indy получить сообщение от сервера и кинуть его сразу в MsgBox ? Вот мой код:
Код:
unit Socket;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, XPMan, Buttons, IdTCPConnection, IdTCPClient,
IdBaseComponent, IdComponent, IdTCPServer, IdThreadMgr,
IdThreadMgrDefault, IdTimeServer;
type
TMainForm = class(TForm)
XPManifest1: TXPManifest;
btnServer: TButton;
btnClient: TButton;
LablsStart: TLabel;
btnExit1: TBitBtn;
ipServer: TEdit;
ServerPort: TEdit;
LabelipServer: TLabel;
LabelPort: TLabel;
btnStart: TButton;
btnStop: TButton;
LogsMemo: TMemo;
btnConnect: TButton;
EditTransfer: TEdit;
LabelTransfer: TLabel;
btnSend: TButton;
btnExit2: TBitBtn;
IdTCPServer1: TIdTCPServer;
IdTCPClient1: TIdTCPClient;
IdTimeServer1: TIdTimeServer;
procedure FormActivate(Sender: TObject);
procedure btnClientClick(Sender: TObject);
procedure btnServerClick(Sender: TObject);
procedure btnStartClick(Sender: TObject);
procedure btnStopClick(Sender: TObject);
procedure btnConnectClick(Sender: TObject);
procedure btnSendClick(Sender: TObject);
procedure IdTCPServer1Execute(AThread: TIdPeerThread);
function GetSubStr(st:string; expl:string; n:integer):string;
procedure IdTCPClient1Connected(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
MainForm: TMainForm;
implementation
uses IdSocketHandle;
{$R *.dfm}
function TMainForm.GetSubStr(st:string; expl:string ;n:integer):string;
Var p,i:integer;
Begin
for i:= 1 to n-1 do begin
p:=pos(expl,st);
st:=copy(st,p+1,Length(st)-p);
while (pos(expl,st)=1) and (length(st)>0) do
delete(st,1,1);
end;
p:=pos(expl,st);
if p<>0 then result:=copy(st,1,p-1)
else result:=st;
End;
procedure TMainForm.FormActivate(Sender: TObject);
begin
btnConnect.Hide;
btnSend.Hide;
btnExit1.Hide;
btnExit2.Hide;
btnStart.Hide;
btnStop.Hide;
EditTransfer.Hide;
ipServer.Hide;
LabelipServer.Hide;
LabelPort.Hide;
LabelTransfer.Hide;
LablsStart.Show;
LogsMemo.Hide;
ServerPort.Hide;
end;
procedure TMainForm.btnClientClick(Sender: TObject);
begin
btnServer.Hide;
btnClient.Hide;
btnConnect.show;
btnSend.show;
btnExit1.Hide;
btnExit2.Show;
btnStart.Hide;
btnStop.Hide;
EditTransfer.Show;
ipServer.Show;
LabelipServer.Show;
LabelPort.Show;
LabelTransfer.Show;
LablsStart.Hide;
LogsMemo.Hide;
ServerPort.Show;
end;
procedure TMainForm.btnServerClick(Sender: TObject);
begin
btnServer.Hide;
btnClient.Hide;
btnConnect.Hide;
btnSend.Hide;
btnExit1.Show;
btnExit2.Hide;
btnStart.Show;
btnStop.Show;
EditTransfer.Hide;
ipServer.Show;
LabelipServer.Show;
LabelPort.Show;
LabelTransfer.Show;
LablsStart.Hide;
LogsMemo.Show;
ServerPort.Show;
end;
procedure TMainForm.btnStartClick(Sender: TObject);
var bind:TIdSocketHandle;
begin
IdTCPServer1.Bindings.Clear;
bind:=TIdSocketHandle.Create(IdTCPServer1.Bindings);
bind.IP:= ipServer.Text;
bind.Port:= StrToInt(ServerPort.Text);
IdTCPServer1.Active := true;
If IdTCPServer1.Active then LogsMemo.Lines.Add('Server is Started!');
end;
procedure TMainForm.btnStopClick(Sender: TObject);
begin
IdTCPServer1.Active := false;
If IdTCPServer1.Active = false then LogsMemo.Lines.Add('Server is Stop!');
end;
procedure TMainForm.btnConnectClick(Sender: TObject);
begin
IdTCPClient1.Host:= ipServer.Text;
IdTCPClient1.Port:= StrToInt(ServerPort.text);
IdTCPClient1.Connect;
if IdTCPClient1.Connected
then begin
btnConnect.Enabled := false;
IdTCPClient1.Write('Client connected!');
end;
end;
procedure TMainForm.btnSendClick(Sender: TObject);
var Temp:String;
begin
IdTCPClient1.Write(EditTransfer.Text);
end;
procedure TMainForm.IdTCPServer1Execute(AThread: TIdPeerThread);
var
lt: TSYSTEMTIME;
st: String;
i,max: integer;
a:array of integer;
begin
st := AThread.Connection.CurrentReadBuffer;
SetLength(a,length(st)-1);
i:= 0;
max:= 0;
GetLocalTime(lt);
if not(st = 'Client connected!')
then begin
for i:=1 to length(st)-1 do begin
a[i]:=StrToInt(GetSubStr(st,' ',i));
if a[i]>max then max := a[i]; end;
LogsMemo.Lines.Add(IntToStr(lt.wHour)+':'+IntToStr(lt.wMinute)+':'
+IntToStr(lt.wSecond)+' Îòïðàâëåíî '+IntToStr(max));
AThread.Connection.Write(IntToStr(max));
end
else LogsMemo.Lines.Add(IntToStr(lt.wHour)+':'+IntToStr(lt.wMinute)+':'
+IntToStr(lt.wSecond)+' '+st);
end;
procedure TMainForm.IdTCPClient1Connected(Sender: TObject);
var
Temp:String;
Begin
//Temp:=TStringList.Create();
//while IdTCPClient1.Connected do
//begin
//IdTCPClient1.ReadLn(Temp);
//MessageBox(0, PChar(Temp), PChar('Ìàêñèìàëüíîå ÷èñëî'), mb_Right);
//Temp.Clear;
//end;
end;
end.
В общем тут сразу и клиент и сервер, всё хорошо работает в сторону сервера, а вот обратно как послать сообщение? пытался в последней процедуре но клиент виснит...( Буду благодарен любой помощи!
|