• 0
serg557

[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

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

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

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


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

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

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

 

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

 

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

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

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


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

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

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

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

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

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


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

  • Похожий контент

    • От Юрий Гусач
      Есть немного странная проблема!
      Пытаюсь написать программу посылающую почту со смартфона.Используются Indy компоненты TIdSMTP,TIdMessage и TIdSSLIOHandlerSocketOpenSSL. Под Windows с компа все работает нормально.
      но если тема, имя адресата или имя посылающего содержат русские буквы, то если посылать почту со смартфона, они появляются в пришедшем письме вопросиками. Понятно, что дело в кодировке. Не могу найти что менять. Само тело письма пишется с кодировкой UTF-8 и отображается везде по русски совершенно нормально. Имена и тема с русскими буквами с компьютера и Windows приходят правильно, со смартфона(при компиляции под Android) приходят неправильно. Перепробовал вроде почти все комбинации.
      Почта со смартфона при наборе вручную тоже работает нормально. Дело по-видимому в конфигурации TIdMessage, а где не пойму.  Работаю в Delphi XE10, смартфон Samsung J3, Android 5.1.1  
      Проще всего конечно не использовать в теме письма русские буквы, при  этом все работает,  но это не нравится, потому что непонятно почему так происходит. 
    • От 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 не блокировал форму при скачивании файла?
  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу