Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / fmx как создать клиент- серверное приложение? / 14 сообщений из 14, страница 1 из 1
24.02.2020, 23:01
    #39930356
FIL23
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
fmx как создать клиент- серверное приложение?
Добрых суток,


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


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

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


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

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


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


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

Спасибо.

"Чистый tcp сервер" - гемор один, бери что-нибудь поверх tcp.
...
Рейтинг: 0 / 0
25.02.2020, 20:15
    #39930757
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
fmx как создать клиент- серверное приложение?
Простой пример клиент-серверного чата на 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
28.03.2020, 18:49
    #39941906
FIL23
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
fmx как создать клиент- серверное приложение?
На конец то выбрался с делами и хочу продолжить тему данной ветки.

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

Выкладываю сюда как архив , так и код. Все на 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
28.03.2020, 18:51
    #39941907
FIL23
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
fmx как создать клиент- серверное приложение?
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
29.03.2020, 01:15
    #39941941
ъъъъъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
fmx как создать клиент- серверное приложение?
FIL23
Код: pascal
1.
[DCC Error] Unit6.pas(74): E2003 Undeclared identifier: 'Data'

...
Рейтинг: 0 / 0
29.03.2020, 12:34
    #39942000
Vizit0r
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
fmx как создать клиент- серверное приложение?
если в 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
29.03.2020, 17:52
    #39942047
FIL23
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
fmx как создать клиент- серверное приложение?
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
04.05.2020, 13:38
    #39954070
Vizit0r
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
fmx как создать клиент- серверное приложение?
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
04.05.2020, 13:47
    #39954074
FIL23
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
fmx как создать клиент- серверное приложение?
Vizit0r,

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

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

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

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

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


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