Александр Лукьянов (Filament Extruder 1.75) Опубликовано 24 мая, 2018 Поделиться Опубликовано 24 мая, 2018 (изменено) Добрый день. Под Windows этот же код нормально работает. под Android - нет. когда клиентом пытаюсь подключиться то получаю 10061 ошибку сокета. и ошибок приложение под андройд не выдает. пытаюсь создать компонент и получить текст по TCP unit Unit1; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, IdContext, IdBaseComponent, IdComponent, IdCustomTCPServer, IdTCPServer, FMX.Controls.Presentation, FMX.StdCtrls,IDGlobal, FMX.ScrollBox, FMX.Memo; type // Объявление записи клиента TStructureConfig = Record TopicName : TStringList; MYSQL_Server : TStringList; MYSQL_Port : TStringList; MYSQL_DataBase : TStringList; MYSQL_TableName : TStringList; MYSQL_TableRowName : TStringList; MYSQL_TableRowCount : TStringList; MYSQL_TableWriteTime : TStringList; MYSQL_HTTP_API : TStringList; end; type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); procedure TCPServerOnExecute(AContext: TIdContext); private { Private declarations } public { Public declarations } Config:TStructureConfig; IdTCPServer1:TIdTCPServer; end; var Form1: TForm1; implementation {$R *.fmx} procedure TForm1.FormCreate(Sender: TObject); begin form1.Config.TopicName:=TstringList.Create; form1.Config.MYSQL_Server:=TstringList.Create; form1.Config.MYSQL_Port:=TstringList.Create; form1.Config.MYSQL_DataBase:=TstringList.Create; form1.Config.MYSQL_TableName:=TstringList.Create; form1.Config.MYSQL_TableRowName:=TstringList.Create; form1.Config.MYSQL_TableRowCount:=TstringList.Create; form1.Config.MYSQL_TableWriteTime:=TstringList.Create; form1.Config.MYSQL_HTTP_API:=TstringList.Create; IdTCPServer1:=TIdTCPServer.Create(nil); IdTCPServer1.OnExecute:=form1.TCPServerOnExecute; //IdTCPServer1.DefaultPort:=5000; IdTCPServer1.Bindings.Clear; idTCPserver1.Bindings.Add.Port:=5000; idTCPserver1.Bindings.Add.IP:='0.0.0.0'; IdTCPServer1.Active:=true; end; procedure TForm1.TCPServerOnExecute(AContext: TIdContext); var tmp,strText: String; en:IIDTextEncoding; h:integer; st:TstringList; begin try en:=IndyTextEncoding(IdTextEncodingType.encUTF8); strText:=AContext.Connection.Socket.ReadLn(en); strText := StringReplace(strText, chr(12),chr(13)+chr(10),[rfReplaceAll, rfIgnoreCase]); st:=TstringList.Create; st.Text:=strText; form1.Config.TopicName.Clear; form1.Config.MYSQL_Server.Clear; form1.Config.MYSQL_Port.Clear; form1.Config.MYSQL_DataBase.Clear; form1.Config.MYSQL_TableName.Clear; form1.Config.MYSQL_TableRowName.Clear; form1.Config.MYSQL_TableRowCount.Clear; form1.Config.MYSQL_TableWriteTime.Clear; form1.Config.MYSQL_HTTP_API.Clear; h:=0; while h<=st.Count-1 do begin tmp:=st.Strings[h]; delete(tmp,pos(chr(9),tmp),length(tmp)); form1.Config.TopicName.Add(tmp); tmp:=st.Strings[h]; delete(tmp,1,pos(chr(9),tmp)); delete(tmp,pos(chr(9),tmp),length(tmp)); form1.Config.MYSQL_Server.Add(tmp); tmp:=st.Strings[h]; delete(tmp,1,pos(chr(9),tmp)); delete(tmp,1,pos(chr(9),tmp)); delete(tmp,pos(chr(9),tmp),length(tmp)); form1.Config.MYSQL_Port.Add(tmp); tmp:=st.Strings[h]; delete(tmp,1,pos(chr(9),tmp)); delete(tmp,1,pos(chr(9),tmp)); delete(tmp,1,pos(chr(9),tmp)); delete(tmp,pos(chr(9),tmp),length(tmp)); form1.Config.MYSQL_DataBase.Add(tmp); tmp:=st.Strings[h]; delete(tmp,1,pos(chr(9),tmp)); delete(tmp,1,pos(chr(9),tmp)); delete(tmp,1,pos(chr(9),tmp)); delete(tmp,1,pos(chr(9),tmp)); delete(tmp,pos(chr(9),tmp),length(tmp)); form1.Config.MYSQL_TableName.Add(tmp); tmp:=st.Strings[h]; delete(tmp,1,pos(chr(9),tmp)); delete(tmp,1,pos(chr(9),tmp)); delete(tmp,1,pos(chr(9),tmp)); delete(tmp,1,pos(chr(9),tmp)); delete(tmp,1,pos(chr(9),tmp)); delete(tmp,pos(chr(9),tmp),length(tmp)); form1.Config.MYSQL_TableRowName.Add(tmp); tmp:=st.Strings[h]; delete(tmp,1,pos(chr(9),tmp)); delete(tmp,1,pos(chr(9),tmp)); delete(tmp,1,pos(chr(9),tmp)); delete(tmp,1,pos(chr(9),tmp)); delete(tmp,1,pos(chr(9),tmp)); delete(tmp,1,pos(chr(9),tmp)); delete(tmp,pos(chr(9),tmp),length(tmp)); form1.Config.MYSQL_TableRowCount.Add(tmp); tmp:=st.Strings[h]; delete(tmp,1,pos(chr(9),tmp)); delete(tmp,1,pos(chr(9),tmp)); delete(tmp,1,pos(chr(9),tmp)); delete(tmp,1,pos(chr(9),tmp)); delete(tmp,1,pos(chr(9),tmp)); delete(tmp,1,pos(chr(9),tmp)); delete(tmp,1,pos(chr(9),tmp)); delete(tmp,pos(chr(9),tmp),length(tmp)); form1.Config.MYSQL_TableWriteTime.Add(tmp); tmp:=st.Strings[h]; delete(tmp,1,pos(chr(9),tmp)); delete(tmp,1,pos(chr(9),tmp)); delete(tmp,1,pos(chr(9),tmp)); delete(tmp,1,pos(chr(9),tmp)); delete(tmp,1,pos(chr(9),tmp)); delete(tmp,1,pos(chr(9),tmp)); delete(tmp,1,pos(chr(9),tmp)); delete(tmp,1,pos(chr(9),tmp)); delete(tmp,pos(chr(9),tmp),length(tmp)); form1.Config.MYSQL_HTTP_API.Add(tmp); inc(h); end; except end; try st.Free; except end; end; end. Изменено 24 мая, 2018 пользователем Александр Лукьянов (Filament Extruder 1.75) Цитата Ссылка на комментарий
0 Евгений Корепов Опубликовано 24 мая, 2018 Поделиться Опубликовано 24 мая, 2018 Попробуйте проверять запустился ли сервер. К примеру так function TForm.CreateTCPServer(Var ATCPPort : Word) : Boolean; begin Result:=False; FIdTCPServer:=TIdTCPServer.Create; FIdTCPServer.OnExecute:=IdTCPServerExecute; FIdTCPServer.OnConnect:=IdTCPServerConnect; FIdTCPServer.Bindings.Clear; with FIdTCPServer.Bindings.Add do begin IP:='0.0.0.0'; Port:=ATCPPort; end; try FIdTCPServer.Active:=True; except Result:=False; end; if FIdTCPServer.Active then Result:=True; end; Цитата Ссылка на комментарий
0 Евгений Корепов Опубликовано 24 мая, 2018 Поделиться Опубликовано 24 мая, 2018 Да, и следующим кодом idTCPserver1.Bindings.Add.Port:=5000; idTCPserver1.Bindings.Add.IP:='0.0.0.0'; вы создаете серверу два интерфейса для прослушки, один с портом 5000 и не определенным адресом, второй с адресом 0.0.0.0 и не определенным портом. Цитата Ссылка на комментарий
0 Александр Лукьянов (Filament Extruder 1.75) Опубликовано 24 мая, 2018 Автор Поделиться Опубликовано 24 мая, 2018 Active возвращается в true Если tcpserver1 на форму бросить и не создавать компонент то работает пример. Использую 10.1 berlin. Дома попробую 10.1 update 2 и отпишусь Цитата Ссылка на комментарий
0 Евгений Корепов Опубликовано 24 мая, 2018 Поделиться Опубликовано 24 мая, 2018 4 часа назад, Александр Лукьянов (Filament Extruder 1.75) сказал: Active возвращается в true Если tcpserver1 на форму бросить и не создавать компонент то работает пример. Использую 10.1 berlin. Дома попробую 10.1 update 2 и отпишусь Ну значит точно в биндинге дело, делайте вот так: FIdTCPServer.Bindings.Clear; with FIdTCPServer.Bindings.Add do begin IP:='0.0.0.0'; Port:=ATCPPort; end; Ingalime 1 Цитата Ссылка на комментарий
0 Александр Лукьянов (Filament Extruder 1.75) Опубликовано 24 мая, 2018 Автор Поделиться Опубликовано 24 мая, 2018 (изменено) спасибо. проблема была в этом кажется. Изменено 24 мая, 2018 пользователем Александр Лукьянов (Filament Extruder 1.75) Цитата Ссылка на комментарий
Вопрос
Александр Лукьянов (Filament Extruder 1.75)
Добрый день.
Под Windows этот же код нормально работает. под Android - нет. когда клиентом пытаюсь подключиться то получаю 10061 ошибку сокета.
и ошибок приложение под андройд не выдает. пытаюсь создать компонент и получить текст по TCP
unit Unit1; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, IdContext, IdBaseComponent, IdComponent, IdCustomTCPServer, IdTCPServer, FMX.Controls.Presentation, FMX.StdCtrls,IDGlobal, FMX.ScrollBox, FMX.Memo; type // Объявление записи клиента TStructureConfig = Record TopicName : TStringList; MYSQL_Server : TStringList; MYSQL_Port : TStringList; MYSQL_DataBase : TStringList; MYSQL_TableName : TStringList; MYSQL_TableRowName : TStringList; MYSQL_TableRowCount : TStringList; MYSQL_TableWriteTime : TStringList; MYSQL_HTTP_API : TStringList; end; type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); procedure TCPServerOnExecute(AContext: TIdContext); private { Private declarations } public { Public declarations } Config:TStructureConfig; IdTCPServer1:TIdTCPServer; end; var Form1: TForm1; implementation {$R *.fmx} procedure TForm1.FormCreate(Sender: TObject); begin form1.Config.TopicName:=TstringList.Create; form1.Config.MYSQL_Server:=TstringList.Create; form1.Config.MYSQL_Port:=TstringList.Create; form1.Config.MYSQL_DataBase:=TstringList.Create; form1.Config.MYSQL_TableName:=TstringList.Create; form1.Config.MYSQL_TableRowName:=TstringList.Create; form1.Config.MYSQL_TableRowCount:=TstringList.Create; form1.Config.MYSQL_TableWriteTime:=TstringList.Create; form1.Config.MYSQL_HTTP_API:=TstringList.Create; IdTCPServer1:=TIdTCPServer.Create(nil); IdTCPServer1.OnExecute:=form1.TCPServerOnExecute; //IdTCPServer1.DefaultPort:=5000; IdTCPServer1.Bindings.Clear; idTCPserver1.Bindings.Add.Port:=5000; idTCPserver1.Bindings.Add.IP:='0.0.0.0'; IdTCPServer1.Active:=true; end; procedure TForm1.TCPServerOnExecute(AContext: TIdContext); var tmp,strText: String; en:IIDTextEncoding; h:integer; st:TstringList; begin try en:=IndyTextEncoding(IdTextEncodingType.encUTF8); strText:=AContext.Connection.Socket.ReadLn(en); strText := StringReplace(strText, chr(12),chr(13)+chr(10),[rfReplaceAll, rfIgnoreCase]); st:=TstringList.Create; st.Text:=strText; form1.Config.TopicName.Clear; form1.Config.MYSQL_Server.Clear; form1.Config.MYSQL_Port.Clear; form1.Config.MYSQL_DataBase.Clear; form1.Config.MYSQL_TableName.Clear; form1.Config.MYSQL_TableRowName.Clear; form1.Config.MYSQL_TableRowCount.Clear; form1.Config.MYSQL_TableWriteTime.Clear; form1.Config.MYSQL_HTTP_API.Clear; h:=0; while h<=st.Count-1 do begin tmp:=st.Strings[h]; delete(tmp,pos(chr(9),tmp),length(tmp)); form1.Config.TopicName.Add(tmp); tmp:=st.Strings[h]; delete(tmp,1,pos(chr(9),tmp)); delete(tmp,pos(chr(9),tmp),length(tmp)); form1.Config.MYSQL_Server.Add(tmp); tmp:=st.Strings[h]; delete(tmp,1,pos(chr(9),tmp)); delete(tmp,1,pos(chr(9),tmp)); delete(tmp,pos(chr(9),tmp),length(tmp)); form1.Config.MYSQL_Port.Add(tmp); tmp:=st.Strings[h]; delete(tmp,1,pos(chr(9),tmp)); delete(tmp,1,pos(chr(9),tmp)); delete(tmp,1,pos(chr(9),tmp)); delete(tmp,pos(chr(9),tmp),length(tmp)); form1.Config.MYSQL_DataBase.Add(tmp); tmp:=st.Strings[h]; delete(tmp,1,pos(chr(9),tmp)); delete(tmp,1,pos(chr(9),tmp)); delete(tmp,1,pos(chr(9),tmp)); delete(tmp,1,pos(chr(9),tmp)); delete(tmp,pos(chr(9),tmp),length(tmp)); form1.Config.MYSQL_TableName.Add(tmp); tmp:=st.Strings[h]; delete(tmp,1,pos(chr(9),tmp)); delete(tmp,1,pos(chr(9),tmp)); delete(tmp,1,pos(chr(9),tmp)); delete(tmp,1,pos(chr(9),tmp)); delete(tmp,1,pos(chr(9),tmp)); delete(tmp,pos(chr(9),tmp),length(tmp)); form1.Config.MYSQL_TableRowName.Add(tmp); tmp:=st.Strings[h]; delete(tmp,1,pos(chr(9),tmp)); delete(tmp,1,pos(chr(9),tmp)); delete(tmp,1,pos(chr(9),tmp)); delete(tmp,1,pos(chr(9),tmp)); delete(tmp,1,pos(chr(9),tmp)); delete(tmp,1,pos(chr(9),tmp)); delete(tmp,pos(chr(9),tmp),length(tmp)); form1.Config.MYSQL_TableRowCount.Add(tmp); tmp:=st.Strings[h]; delete(tmp,1,pos(chr(9),tmp)); delete(tmp,1,pos(chr(9),tmp)); delete(tmp,1,pos(chr(9),tmp)); delete(tmp,1,pos(chr(9),tmp)); delete(tmp,1,pos(chr(9),tmp)); delete(tmp,1,pos(chr(9),tmp)); delete(tmp,1,pos(chr(9),tmp)); delete(tmp,pos(chr(9),tmp),length(tmp)); form1.Config.MYSQL_TableWriteTime.Add(tmp); tmp:=st.Strings[h]; delete(tmp,1,pos(chr(9),tmp)); delete(tmp,1,pos(chr(9),tmp)); delete(tmp,1,pos(chr(9),tmp)); delete(tmp,1,pos(chr(9),tmp)); delete(tmp,1,pos(chr(9),tmp)); delete(tmp,1,pos(chr(9),tmp)); delete(tmp,1,pos(chr(9),tmp)); delete(tmp,1,pos(chr(9),tmp)); delete(tmp,pos(chr(9),tmp),length(tmp)); form1.Config.MYSQL_HTTP_API.Add(tmp); inc(h); end; except end; try st.Free; except end; end; end.
Ссылка на комментарий
5 ответов на этот вопрос
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.