• 0
serg557

TidTCPServer [TidTCPServer] Подружить TCPServer(vcl) TCPClient(fmx)

Вопрос

Вопрос заключается в следующем - есть сервер сделанный в VCL

Server1->DefaultPort=6590
void __fastcall TForm3::Server1Execute(TIdContext *AContext) // на запрос от клиента
{
 TIdIOHandler *a = AContext->Connection->IOHandler;
 UnicodeString res = a->ReadLn(IndyUTF8Encoding(true));
 if (res == "zapros")
  {
   if (ListBox1->Items->Strings[0]!="")
	{
	a->WriteLn(ListBox1->Items->Strings[0],IndyUTF8Encoding(true));
	a->WriteLn(ListBox3->Items->Strings[0],IndyUTF8Encoding(true));
	ListBox2->Items->Add("("+AContext->Connection->Socket->Binding->IP+")"+ListBox1->Items->Strings[0]);
	}

есть клиент написанный на vcl

//порт указан вручную
 Client1->Host =Edit2->Text;
 if (Client1->Connected()==false)
 {
  try
 {
 Client1->Connect();

 }
 catch(...)
 {
  ShowMessage("Не удалось подключиться");
 }
 }
TIdIOHandler *a = Client1->IOHandler;
a->WriteLn("zapros",enUTF8);
Edit1->Text=a->ReadLn(enUTF8);
Edit5->Text=a->ReadLn(enUTF8);
a->Free();
}

рабочий, захотел переложить его на FMX:

Client1->Port=6590;
Client1->Host=Edit1->Text;
 if (Client1->Connected()==false)
 {
  try
  {
  Client1->Connect();

  }
 catch(...)
  {
  Client1->Socket->Close();
  ShowMessage("Не удалось подключиться");
  }
}
TIdIOHandler *a = Client1->IOHandler;
a->WriteLn("zapros",IndyUTF8Encoding(true));
Edit3->Text=a->ReadLn(IndyUTF8Encoding(true));
Edit5->Text=a->ReadLn(IndyUTF8Encoding(true));
Client1->Socket->Close();
a->Free();
}

выдает ошибку 

Цитата

 

Unknown protocol

 Может подскажет кто-как их помирить? (Сервер переписывать не вариант :) )

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

7 ответов на этот вопрос

  • 0

Изменено пользователем krapotkin

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

хм 

а куда делся текст сообщения ? O_O

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

unknown protocol я ловил когда в URL отсутствовало слово http

т.е. протокол действительно не был указан

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

TIdIOHandler *a = Client1->IOHandler;
...
a->Free();
}

Меня одного этот участок кода несколько озадачил?

 

Ну и - не в http дело, тут же tcp в "чистом" виде используется вроде как. То есть - должно быть достаточно указания порт + хост (желательно - в IP виде)

 

Serg557, вы бы хоть сказали - на какой строке выдает ошибку, бо непонятно - то ли при коннекте, то ли при отправке. И кто выдает - клиент или сервер?

Изменено пользователем kami

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

Выдавал  клиент, но спасибо  krapotkin -натолкнул на мысль что компоненты IdTCPClient и IdTCPServer тут не причем и искать дальше.

Нашел компонент - IdHTTP - который действительно неправильно формировал запрос.

А так компоненты IdTCPClient и IdTCPServer  полностью адекватно друг с другом связываются.

Так что тема закрыта.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Гость
Эта тема закрыта для публикации сообщений.

  • Похожие публикации

    • Автор: bossalex
      Недавно компилил приложение на Delphi  FMX Android  при обращении  к серверу https при выполнении Get запроса от компонента TIdHttp запросил библиотеку "Could not load SSL library" используется протокол sslvTLSv1_2 в windows все пашет в андроид нет , накопал что можно подключить библиотеки  libssl.so и  libcrypto.so через  deployment .assets\internal , А вот как в коде дальше их использовать никто примерчик не выложил, хоть и обсуждали на интернет просторах 100 раз, те как прикрутить  к IdSSLIOHandlerSocketOpenSSL1.SSLOptions.CertFile. Если есть у кого код выложите пожалуйста? или скинте по email bossalex@ya.ru
      IdSSLIOHandlerSocketOpenSSL1.SSLOptions.Method.sslvTLSv1_2;
      IdSSLIOHandlerSocketOpenSSL1.SSLOptions.Mode.sslmUnassigned;
       
    • Автор: Рагим
      Доброго времени суток.
      Есть приложение на Windows (сервер) и есть от 1 до 4 приложений (клиенты) на Андроид. Все устройства в сети. IP адреса клиентов не известны серверу, а адрес сервера клиентам. Приложения после того как узнают адреса друг друга, будут обмениваться сообщениями через TIdTcpClient и TIdTcpServer. 
      Как лучше реализовать распознавание клиентов в сети? Делаю сейчас используя Tethering, но способ мне не нравится.
    • Автор: Morfi
      Здравствуйте!
      Пытаюсь реализовать алгоритм PBKDF2-SHA1. Для вычисления HMAC-SHA1 использую класс TidHMACSHA1.
      Код PBKDF2-SHA1 нашел на просторах интернета и немного подкорректировал для использования с INDY (TidHMACSHA1):
      function PBKDF2Sha1(pass, salt: string; count, kLen: Integer): string; function IntX(i: Integer): string; inline; begin Result := Char(i shr 24) + Char(i shr 16) + Char(i shr 8) + Char(i); end; var D, I, J: Integer; T, F, U, wPass: TIdBytes; begin wPass := ToBytes(pass); D := Ceil(kLen / (160 div 8)); for i := 1 to D do begin F := EncryptHMACSha1(ToBytes(salt + IntX(i)), wPass); U := F; for j := 2 to count do begin U := EncryptHMACSha1(U, wPass); //<-- Проблема F := XorBlock(F, U); end; T := T + F; end; Result := ToHex(Copy(T, 1, kLen)); end; Для вычисления HMAC-SHA1 используется функция EncryptHMACSha1:
      function EncryptHMACSha1(Input, AKey: TIdBytes): TIdBytes; var HMachSha1: TIdHMACSHA1; begin HMachSha1 := TIdHMACSHA1.Create; try HMachSha1.Key := AKey; Result := HMachSha1.HashValue(Input); finally HMachSha1.Free; end; end; Возникает проблема, когда эта функция используется 6-й раз в функции PBKDF2Sha1:
      for i := 1 to D do // D := 2 begin F := EncryptHMACSha1(ToBytes(salt + IntX(i)), wPass); // Использование функции (разы): 1-й, 4-й U := F; for j := 2 to count do // count := 3 begin U := EncryptHMACSha1(U, wPass); // <--Проблема! Использование функции (разы): 2-й, 3-й, 5-й, !6-й! F := XorBlock(F, U); end; T := T + F; end; Возникает исключение в глубинах INDY-кода:

      а точнее в функции TIdHashSHA1.NativeGetHashBytes (файл: idHashSHA,pas) на строке с кодом:
      SetLength(Result, SizeOf(UInt32)*5); // в файле строка под номером 460 Помогите решить данную проблему.
       
      Версии:
      Delphi: 10.1
      INDY: 10.6.2.5341
    • Автор: loony-pants
      Впервые взялся за разработку Клиент-серверного приложения.  Нашёл пример с IdTCPServer и IdTCPClient, попытался начать с реализации  запроса-ответа. При нажатии на кнопку клиент зависает (Как я понял - соединение не происходит). Ip адрес указывал просмотрев с сайта 2ip.ru и тот, что в "сведениях о сетевом подключении" - результат один и тот же - Зависает клиент. Пробовал с IdUDPClient и IdUDPServer - работает, НО только во внутренней сети, а мне необходим глобальный обмен.
       
      Клиент:
      procedure TForm2.LoginButtonClick(Sender: TObject); begin try IdTCPClient1.Host :='127.0.0.1'; /// Менял IP адрес   IdTCPClient1.Port:=55560; IdTCPClient1.Connect; except Memo2.Lines.Add('Не удается соединиться с указанным сервером'); Exit; end; Memo2.Lines.Append(IdTCPClient1.Socket.ReadLn); IdTCPClient1.Disconnect; end; Сервер:
      procedure TForm1.FormCreate(Sender: TObject); begin section1 := TCriticalSection.Create; idTcpServer1.DefaultPort:=55560; idTcpServer1.Active:=true; end; procedure TForm1.IdTCPServer1Execute(AContext: TIdContext); var strText: String; begin strText := AContext.Connection.Socket.ReadLn; AContext.Connection.Socket.WriteLn('Login: ' + strText); section1.Enter; Edit3.Text := AContext.Connection.Socket.Binding.PeerIP; section1.Leave; Memo1.Lines.Add(AContext.Connection.Socket.Binding.PeerIP); AContext.Connection.Disconnect; end;
    • Автор: M1shQa
      Добрый день госопда. Есть одно приложение на плюсах под андроид, получаю данные через сокеты по tcp посредством компоненты от Indy (только tcp сокеты, других вариантов начальство не дает). Проблема состоит в том, что каждый раз, когда идет получение на пример картинки, то вcё зависает и висит во фризе до конца получения данных, весь телефон висит! Можно как то решить эту проблему? Особенно это ужасает когда приложение работает в фоне и пытается выкачать картинку, телефон просто зависает и все, ничего не поделаешь..
    • Автор: MIB
      Столкнулся с засадой: нужно передать с клиента (андроид) на сервер (Win) данные
      TArray_Data = record fText_a: String;   a,b:double; ... end; Ранее всегда использовал стандартные ServerSocket / ClientSocket и соответственно ReceiveBuf / SendBuf, а вот в Инди такое не проходит.
      Подскажите, плз, вариант решения? 
       
    • Автор: ivadimos
      Собственно в IdTCPClient возникает Max line length exceeded при чтении.
      Шаманы в интернетах советуют поменять величину константы IdMaxLineLengthDefault.
      Есть ли другие способы решения?
    • Автор: AndreyS
      День добрый! Пишу приложение, которое периодически загружает информацию с сайта. Способ простейший - 
      SiteResult := IdHTTP.Get('http://example.com/'); На компе стоит dr. web. Обычно, когда какое-либо приложение пытается получить данные из сети, вываливается стандартное окошко брандмауэра, мол, так и так, данное приложение пытается получить доступ к сети, разрешить, заблокировать или создать для него правило. В моем же случае такого не происходит. Просто при выполнении  указанной строки кода появляется сообщение об ошибке сокета #10013 Access Denied в независимости от указанного адреса (включая localhost). При попытке отправки POST-запроса - та же история. При отключении брандмауэра dr. web все запросы отрабатываются без осложнений)). В чем может быть причина? Может у TidHTTP должны быть определенным способом заполнены какие-то свойства?
    • Автор: iworm2009
      Здравствуйте. Нет в дизайн тайм соответствующего компонента.
      Как сделать, чтобы idHttp не блокировал форму при скачивании файла?
    • Автор: brunnengi
      Здравствуйте.
      Был проект на Delphi7, решил пересадить его на FMX. Приложение на аднройде (сделан в эклипсе) отправляет GET запрос с русскими символами.
      Принимаю запрос через idHTTPServer. Но русские буквы не распознаются. Кодировка в которой отправляет приложение на андройде ISO-8859-1. Как сделать так что бы idhttpserver правильно прочел эти данные. И мог в также ответить клиенту.
      Перепробовал кучу советов в инете, но все не работает.
  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу