powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / fmx как создать клиент- серверное приложение?
14 сообщений из 14, страница 1 из 1
fmx как создать клиент- серверное приложение?
    #39930356
FIL23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрых суток,


Может у кого есть простенький пример клиент-серверного приложения, чтобы в нем можно было сообщениями обмениваться?


Хочу реализовать через TCP indy.

Спасибо.
...
Рейтинг: 0 / 0
fmx как создать клиент- серверное приложение?
    #39930361
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В плане демок очень хорошо у Overbyte ICS. А вот самую известную сетевую библиотеку Indy демками почему-то обделили. Зато есть тысячи сообщений в различных форумах, поиском найти их не должно вызвать большой проблемы.
...
Рейтинг: 0 / 0
fmx как создать клиент- серверное приложение?
    #39930371
FIL23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer
В плане демок очень хорошо у Overbyte ICS. А вот самую известную сетевую библиотеку Indy демками почему-то обделили. Зато есть тысячи сообщений в различных форумах, поиском найти их не должно вызвать большой проблемы.


я честно гуглил прежде чем сюда писать.
...
Рейтинг: 0 / 0
fmx как создать клиент- серверное приложение?
    #39930378
Sinemurius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://mraven.ru/ravenlink_quick.html

В скачиваемый релиз входит сервер, пример базы данных, компоненты для связи с сервером, пример клиента (в т.ч. и на андроид).
Вы можете открыть страницу "Быстрый старт" и там подробное описание: как за 10 минут установить библиотеку, запустить сервер с примером и т.д.
...
Рейтинг: 0 / 0
fmx как создать клиент- серверное приложение?
    #39930398
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FIL23
Добрых суток,


Может у кого есть простенький пример клиент-серверного приложения, чтобы в нем можно было сообщениями обмениваться?


Хочу реализовать через TCP indy.

Спасибо.

"Чистый tcp сервер" - гемор один, бери что-нибудь поверх tcp.
...
Рейтинг: 0 / 0
fmx как создать клиент- серверное приложение?
    #39930757
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Простой пример клиент-серверного чата на indy.
FMX сам прикрутишь. Разницы с VCL нет, а мне влом.

как-то так
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
unit Main;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, IdTCPConnection, IdTCPClient, IdBaseComponent, IdComponent, IdCustomTCPServer,
  IdTCPServer, Vcl.StdCtrls, Vcl.ExtCtrls, IdContext, System.SyncObjs;

type
  TForm9 = class(TForm)
    ListBox1: TListBox;
    LabeledEdit1: TLabeledEdit;
    LabeledEdit2: TLabeledEdit;
    ListBox2: TListBox;
    Button1: TButton;
    Button2: TButton;
    LabeledEdit3: TLabeledEdit;
    LabeledEdit4: TLabeledEdit;
    Server: TIdTCPServer;
    Client: TIdTCPClient;
    Button3: TButton;
    Button4: TButton;
    LabeledEdit5: TLabeledEdit;
    Timer1: TTimer;
    procedure Button1Click(Sender: TObject);
    procedure ServerConnect(AContext: TIdContext);
    procedure Button2Click(Sender: TObject);
    procedure ServerExecute(AContext: TIdContext);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure ServerDisconnect(AContext: TIdContext);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure Timer1Timer(Sender: TObject);
    procedure ClientConnected(Sender: TObject);
    procedure ClientDisconnected(Sender: TObject);
  private
  public
  end;

  TClientData = class
    Id : integer;
  end;

var
  Form9    : TForm9;
  MaxId    : integer = 0;

implementation

{$R *.dfm}

procedure TForm9.Button1Click(Sender: TObject);
begin
  Server.Active:=False;
  Server.DefaultPort:=StrToIntDef(LabeledEdit3.Text,0);
  Server.Active:=True;
end;

procedure TForm9.Button2Click(Sender: TObject);
begin
  Client.Disconnect;
  Client.Host:=LabeledEdit4.Text;
  Client.Port:=StrToIntDef(LabeledEdit3.Text,0);
  Client.Connect;
end;

procedure TForm9.Button3Click(Sender: TObject);
begin
  Client.IOHandler.WriteLn(LabeledEdit2.Text);
end;

procedure TForm9.Button4Click(Sender: TObject);
begin
  var id:=StrToIntDef(LabeledEdit5.Text,0);
  var List:=Server.Contexts.LockList;
  try
    for var Context: TIdContext in List do begin
      if TClientData(Context.Data).Id=Id then begin
        Context.Connection.IOHandler.WriteLn(LabeledEdit1.Text);
      end;
    end;
  finally
    Server.Contexts.UnlockList;
  end;
end;

procedure TForm9.ClientConnected(Sender: TObject);
begin
  Timer1.Enabled:=True;
end;

procedure TForm9.ClientDisconnected(Sender: TObject);
begin
  Timer1.Enabled:=False;
end;

procedure TForm9.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Client.Disconnect;
  Server.Active:=False;
end;

procedure TForm9.ServerConnect(AContext: TIdContext);
begin
  var CD:=TClientData.Create;
  CD.Id:=TInterlocked.Increment(MaxId);
  AContext.Data:=CD;
  ListBox1.Items.Add('Connected '+AContext.Binding.PeerIP+ ' id = '+CD.Id.ToString);
  LabeledEdit5.Text:=CD.Id.ToString;
end;

procedure TForm9.ServerDisconnect(AContext: TIdContext);
begin
  ListBox1.Items.Add('Disconnected '+AContext.Binding.PeerIP+ ' id = '+TClientData(AContext.Data).Id.ToString);
end;

procedure TForm9.ServerExecute(AContext: TIdContext);
begin
  ListBox1.Items.Add('ClientId ['+TClientData(AContext.Data).Id.ToString+'] Message: '+AContext.Connection.Socket.ReadLn);
end;

procedure TForm9.Timer1Timer(Sender: TObject);
begin
  if Assigned(Client) and Client.IOHandler.Opened and Client.IOHandler.Readable(1) then begin
    ListBox2.Items.Add(Client.IOHandler.ReadLn);
  end;
end;

end.

...
Рейтинг: 0 / 0
fmx как создать клиент- серверное приложение?
    #39941906
FIL23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На конец то выбрался с делами и хочу продолжить тему данной ветки.

Я написал приложение как в примере, но не работает, т.к. там есть пару моментов которые я не могу так просто найти на просторах интернета в хороших примерах, а в программировании я не сильно спец.

Выкладываю сюда как архив , так и код. Все на FMX. Максимально старался повторить код.

Получаю ошибку (естественно) при компиляции
Код: pascal
1.
[DCC Error] Unit6.pas(74): E2003 Undeclared identifier: 'Data'





Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
unit Unit6;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
  IdTCPConnection, IdTCPClient, IdBaseComponent, IdComponent, IdCustomTCPServer,
  IdTCPServer, FMX.Layouts, FMX.ListBox, FMX.StdCtrls, FMX.Edit,
  FMX.Controls.Presentation,IdContext,System.SyncObjs;

type
  TForm6 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Label1: TLabel;
    ListBox1: TListBox;
    Label2: TLabel;
    Edit2: TEdit;
    Edit3: TEdit;
    Label3: TLabel;
    Button2: TButton;
    Button3: TButton;
    Edit4: TEdit;
    Label4: TLabel;
    ListBox2: TListBox;
    Edit6: TEdit;
    Label6: TLabel;
    Button4: TButton;
    Server: TIdTCPServer;
    Client: TIdTCPClient;
    Timer1: TTimer;
    procedure Button1Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure ServerExecute(AContext: TIdContext);
    procedure ServerDisconnect(AContext: TIdContext);
    procedure ServerConnect(AContext: TIdContext);
    procedure ClientConnected(Sender: TObject);
    procedure ClientDisconnected(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  TClientData = class
    Id : integer;
  end;

var
  Form6: TForm6;
  MaxId    : integer = 0;

implementation

{$R *.fmx}

procedure TForm6.Button1Click(Sender: TObject);
begin
  Server.Active:=False;
  Server.DefaultPort:=StrToIntDef(Edit1.Text,0);
  Server.Active:=True;
end;

procedure TForm6.Button2Click(Sender: TObject);
begin
  var id:=StrToIntDef(Edit2.Text,0);
  var List:=Server.Contexts.LockList;
  try
    for var Context: TIdContext in List do begin
      if TClientData(Context.Data).Id=Id then begin
        Context.Connection.IOHandler.WriteLn(Edit3.Text);
      end;
    end;
  finally
    Server.Contexts.UnlockList;
  end;
end;

procedure TForm6.Button3Click(Sender: TObject);
begin
  Client.Disconnect;
  Client.Host:=Edit4.Text;
  Client.Port:=StrToIntDef(Edit1.Text,0);
  Client.Connect;
end;

procedure TForm6.Button4Click(Sender: TObject);
begin
Client.IOHandler.WriteLn(Edit6.Text);
end;

procedure TForm6.ClientConnected(Sender: TObject);
begin
Timer1.Enabled:=True;
end;

procedure TForm6.ClientDisconnected(Sender: TObject);
begin
Timer1.Enabled:=False;
end;

procedure TForm6.ServerConnect(AContext: TIdContext);
begin
  var CD:=TClientData.Create;
  CD.Id:=TInterlocked.Increment(MaxId);
  AContext.Data:=CD;
  ListBox1.Items.Add('Connected '+AContext.Binding.PeerIP+ ' id = '+CD.Id.ToString);
  Edit2.Text:=CD.Id.ToString;
end;

procedure TForm6.ServerDisconnect(AContext: TIdContext);
begin
 ListBox1.Items.Add('Disconnected '+AContext.Binding.PeerIP+ ' id = '+TClientData(AContext.Data).Id.ToString);
end;

procedure TForm6.ServerExecute(AContext: TIdContext);
begin
 ListBox1.Items.Add('ClientId ['+TClientData(AContext.Data).Id.ToString+'] Message: '+AContext.Connection.Socket.ReadLn);
end;

procedure TForm6.Timer1Timer(Sender: TObject);
begin
  if Assigned(Client) and Client.IOHandler.Opened and Client.IOHandler.Readable(1) then begin
    ListBox2.Items.Add(Client.IOHandler.ReadLn);
  end;
end;

end.



...
Рейтинг: 0 / 0
fmx как создать клиент- серверное приложение?
    #39941907
FIL23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FIL23
На конец то выбрался с делами и хочу продолжить тему данной ветки.

Я написал приложение как в примере, но не работает, т.к. там есть пару моментов которые я не могу так просто найти на просторах интернета в хороших примерах, а в программировании я не сильно спец.

Выкладываю сюда как архив , так и код. Все на FMX. Максимально старался повторить код.

Получаю ошибку (естественно) при компиляции
Код: pascal
1.
[DCC Error] Unit6.pas(74): E2003 Undeclared identifier: 'Data'





Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
unit Unit6;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
  IdTCPConnection, IdTCPClient, IdBaseComponent, IdComponent, IdCustomTCPServer,
  IdTCPServer, FMX.Layouts, FMX.ListBox, FMX.StdCtrls, FMX.Edit,
  FMX.Controls.Presentation,IdContext,System.SyncObjs;

type
  TForm6 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Label1: TLabel;
    ListBox1: TListBox;
    Label2: TLabel;
    Edit2: TEdit;
    Edit3: TEdit;
    Label3: TLabel;
    Button2: TButton;
    Button3: TButton;
    Edit4: TEdit;
    Label4: TLabel;
    ListBox2: TListBox;
    Edit6: TEdit;
    Label6: TLabel;
    Button4: TButton;
    Server: TIdTCPServer;
    Client: TIdTCPClient;
    Timer1: TTimer;
    procedure Button1Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure ServerExecute(AContext: TIdContext);
    procedure ServerDisconnect(AContext: TIdContext);
    procedure ServerConnect(AContext: TIdContext);
    procedure ClientConnected(Sender: TObject);
    procedure ClientDisconnected(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  TClientData = class
    Id : integer;
  end;

var
  Form6: TForm6;
  MaxId    : integer = 0;

implementation

{$R *.fmx}

procedure TForm6.Button1Click(Sender: TObject);
begin
  Server.Active:=False;
  Server.DefaultPort:=StrToIntDef(Edit1.Text,0);
  Server.Active:=True;
end;

procedure TForm6.Button2Click(Sender: TObject);
begin
  var id:=StrToIntDef(Edit2.Text,0);
  var List:=Server.Contexts.LockList;
  try
    for var Context: TIdContext in List do begin
      if TClientData(Context.Data).Id=Id then begin
        Context.Connection.IOHandler.WriteLn(Edit3.Text);
      end;
    end;
  finally
    Server.Contexts.UnlockList;
  end;
end;

procedure TForm6.Button3Click(Sender: TObject);
begin
  Client.Disconnect;
  Client.Host:=Edit4.Text;
  Client.Port:=StrToIntDef(Edit1.Text,0);
  Client.Connect;
end;

procedure TForm6.Button4Click(Sender: TObject);
begin
Client.IOHandler.WriteLn(Edit6.Text);
end;

procedure TForm6.ClientConnected(Sender: TObject);
begin
Timer1.Enabled:=True;
end;

procedure TForm6.ClientDisconnected(Sender: TObject);
begin
Timer1.Enabled:=False;
end;

procedure TForm6.ServerConnect(AContext: TIdContext);
begin
  var CD:=TClientData.Create;
  CD.Id:=TInterlocked.Increment(MaxId);
  AContext.Data:=CD;
  ListBox1.Items.Add('Connected '+AContext.Binding.PeerIP+ ' id = '+CD.Id.ToString);
  Edit2.Text:=CD.Id.ToString;
end;

procedure TForm6.ServerDisconnect(AContext: TIdContext);
begin
 ListBox1.Items.Add('Disconnected '+AContext.Binding.PeerIP+ ' id = '+TClientData(AContext.Data).Id.ToString);
end;

procedure TForm6.ServerExecute(AContext: TIdContext);
begin
 ListBox1.Items.Add('ClientId ['+TClientData(AContext.Data).Id.ToString+'] Message: '+AContext.Connection.Socket.ReadLn);
end;

procedure TForm6.Timer1Timer(Sender: TObject);
begin
  if Assigned(Client) and Client.IOHandler.Opened and Client.IOHandler.Readable(1) then begin
    ListBox2.Items.Add(Client.IOHandler.ReadLn);
  end;
end;

end.





Ошибка в этой строке if TClientData(Context.Data).Id=Id then begin
...
Рейтинг: 0 / 0
fmx как создать клиент- серверное приложение?
    #39941941
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
FIL23
Код: pascal
1.
[DCC Error] Unit6.pas(74): E2003 Undeclared identifier: 'Data'

...
Рейтинг: 0 / 0
fmx как создать клиент- серверное приложение?
    #39942000
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если в VCL при зажатом Ctrl кликнуть по Data, то попадешь на ее декларацию.
{$IFDEF USE_OBJECT_ARC}
property DataObject: TObject read FDataObject write FDataObject;
property DataValue: PtrInt read FDataValue write FDataValue;
{$ELSE}
property Data: TObject read FData write FData;
{$ENDIF}

Как бы очевидно.


кстати, в прошлых версиях была проверка на дефайн NEXTGEN, а тут уже внезапно только ARC. Это несколько неожиданно.
...
Рейтинг: 0 / 0
fmx как создать клиент- серверное приложение?
    #39942047
FIL23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vizit0r
если в VCL при зажатом Ctrl кликнуть по Data, то попадешь на ее декларацию.
{$IFDEF USE_OBJECT_ARC}
property DataObject: TObject read FDataObject write FDataObject;
property DataValue: PtrInt read FDataValue write FDataValue;
{$ELSE}
property Data: TObject read FData write FData;
{$ENDIF}

Как бы очевидно.



Вообще не очевидно ... я бы сказал, что я вообще ни чего не понял))

если есть вменяема литература которая объясняет этот выше код, то посоветуйте. Или ключевые слова ... а так я вообще не понял, я не программист.
...
Рейтинг: 0 / 0
fmx как создать клиент- серверное приложение?
    #39954070
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FIL23
Vizit0r
если в VCL при зажатом Ctrl кликнуть по Data, то попадешь на ее декларацию.
{$IFDEF USE_OBJECT_ARC}
property DataObject: TObject read FDataObject write FDataObject;
property DataValue: PtrInt read FDataValue write FDataValue;
{$ELSE}
property Data: TObject read FData write FData;
{$ENDIF}

Как бы очевидно.



Вообще не очевидно ... я бы сказал, что я вообще ни чего не понял))

если есть вменяема литература которая объясняет этот выше код, то посоветуйте. Или ключевые слова ... а так я вообще не понял, я не программист.

по {$IFDEF - http://docwiki.embarcadero.com/RADStudio/Rio/en/Conditional_compilation_(Delphi)
что еще непонятно?
...
Рейтинг: 0 / 0
fmx как создать клиент- серверное приложение?
    #39954074
FIL23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vizit0r,

Закончим этот тред. (предыдущая ссылка вообще не не решает проблемы)

Пофиксилось путем замены строки Context.Data на Context.DataObject это для компиляции под Android.

Под винду так и остается Context.Data.

Вопрос с юникодом, почему то сообщения на русском в виде вопросительных знаков. Сначала погуглю , если не получится . приду сюда.
...
Рейтинг: 0 / 0
fmx как создать клиент- серверное приложение?
    #39954077
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ссылка и не должна была решать проблему.

Ты спросил, где почитать - я тебе скинул. Кто ж знал, что тебе не информация нужна была, а пошаговое руководство без обьяснений.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / fmx как создать клиент- серверное приложение?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]