Добро пожаловать, гость
:: алгоритмы  и методы :: :: олимпиадные задачи :: :: связь :: :: о сайте :: :: форум ::

Форум работает в режиме архива, только для чтения и поиска.
Архив 2004 Архив 2007 Архив 2013

 
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 16.10.2010, 11:06
Новичок

Отправить личное сообщение для MiRiN Посмотреть профиль Найти все сообщения от MiRiN
 
Регистрация: 03.06.2008
Сообщений: 12

Отправка сообщения обратно на клиент Indy 10
Всем привет в общем как с помощью 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.
В общем тут сразу и клиент и сервер, всё хорошо работает в сторону сервера, а вот обратно как послать сообщение? пытался в последней процедуре но клиент виснит...( Буду благодарен любой помощи!
 


Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
обработка сообщения гость Реализация, исходники, языки 2 05.02.2010 05:43
быстрое раскрытие первого сообщения темы Илья Кантор Новости 2 27.05.2007 19:54