Перейти к содержанию
Fire Monkey от А до Я
  • 0

TServerSocket TClientSocket в FireMonkey


lis

Вопрос

Здравствуйте

Мне нужно организовать обмен массивами типа unsigned char между приложением и контроллером через Ethernet. То есть "в сети" будет всегда 1 клиент и 1 сервер.

Столкнулся со следующей проблемой:

При создании приложения на VCL для передачи массивов типа char пользовался указанными в названии темы компонентами

ServerSocket1->Socket->Connections[0]->SendBuf(Message,MessLenght)
void __fastcall TfrmMain::ServerSocket1ClientRead(TObject *Sender, TCustomWinSocket *Socket)
{
RecLenght = Socket->ReceiveLength();
Socket->ReceiveBuf(RecBuffer,RecLenght);
}

Сейчас пишу аналогичное приложение на FireMonkey, и тут указанных компонентов нет.. Попробовал заморочиться с Indy (IdCmdTCPServer1, IdCmdTCPClient1) - пока получается только отправить/получить String, и то как-то неудобно и муторно.. 

MyContext->Connection->IOHandler->WriteLn("lala");
AContext->Connection->IOHandler->ReadLn();

Подскажите пожалуйста, есть ли "заменитель" TServerSocket TClientSocket в FireMonkey? Или может чем ещё можно решить мою задачу..  Или хоть как это сделать через Indy?..

 

Заранее спасибо!

Изменено пользователем lis
Ссылка на комментарий

Рекомендуемые сообщения

  • 0

Попробовал через TcpClient1... От клиента серверу строка уходит, от сервера клиенту - нет.. (для начала строку хотя бы стараюсь ловить)

TcpClient1->Sendln("1223"); //работает
TcpServer1->Sendln("asd"); //не работает
Изменено пользователем lis
Ссылка на комментарий
  • 0

Подскажите пожалуйста, есть ли "заменитель" TServerSocket TClientSocket в FireMonkey? Или может чем ещё можно решить мою задачу..  Или хоть как это сделать через Indy?..

Здравствуйте можно использовать TIdTCPClient!

 

Uses
  IdGlobal;
.........................................
IdTCPClient1.Port := Port;
IdTCPClient1.Host := Host;
IdTCPClient1.Connect;
IdTCPClient1.Socket.WriteLn('asd', IndyTextEncoding_UTF8);

 

самом деле в интернете очень много примеров нужна просто погуглить :)

Ссылка на комментарий
  • 0

Блин, неужели никто с сетью в фаерманки не работает? :lol:

Первый пост 2:39 ночи, второй 5:00, третий 6:50, не услышав ответа в такое время на немногочисленном форуме вы сделали вывод что никто не работает с сетью в ФМ, окей  ;)

Ссылка на комментарий
  • 0

Гуглил уже, и много.. И про writeln писал выше.. только это отправка строки.

а мне надо отправить, например

unsigned char mes[3]
mes[0] = 0x0A;
mes[1] = 0x23;
mes[2] = 0xBC;
IdCMDTCPClient1->Socket->WriteLn(mes, 3);

а не

WideString mytext = "hello word";
IdCMDTCPClient1->Socket->WriteLn(mytext, IndyTextEncoding_UTF8);
Ссылка на комментарий
  • 0

ксенон, вы не поверите, за МКАДом есть другие часовые пояса :lol:

 

ps ок, посмотрим, какая активность будет в теме спустя сутки после создания ;)

Изменено пользователем lis
Ссылка на комментарий
  • 0

Сильная разница в часовых поясах будет только для дальнего востока, а т.к. форум итак мало населен + в это время попадает только маленькая часть тех кто не спит, то подозреваю что на форуме в то время находилось 1-2 человека.

 

Если по теме, то у TIdTCPClient ну или сервер есть IOHandler у которого есть куча перегруженных методов по отправке данных, как строки так и тупо последовательность байт.

 

P.S.: Большой активности на этом форуме вы не увидите, по крайней мере не сейчас, постоянных пользователей, по моим наблюдениям, тут не больше 15 человек.

Изменено пользователем xenon54
Ссылка на комментарий
  • 0

спорно.. но да это не тема разговора B)

 

А можно узнать название подходящего метода? У меня вылетают только  то, что на картинке и нигде в параметрах нет ничего похожего на массив чар..

3bd51e123087.jpg

Изменено пользователем lis
Ссылка на комментарий
  • 0

 

Попробовал через TcpClient1... От клиента серверу строка уходит, от сервера клиенту - нет.. (для начала строку хотя бы стараюсь ловить)

TcpServer1->Sendln("asd"); //не работает

И не будет. Ведь при работе с TServerSocket вы не пытались отправить данные непосредственно через него? Потому что сам ServerSocket - слушающий, а отправлять нужно через реальные подключения. В TServerSocket - это массив Connections, а что у индейца - смотрите сами.

Кроме того - советую обратить внимание на кодировку (если вы работаете с последними версиями Delphi - то скорее всего будет UCS2 - 2 байта на символ, а вот контроллер, наверное, работает с ANSI - 1 байт на символ).

Ссылка на комментарий
  • 0

kami, будь у меня в наличии компонент ServerSocket - этой темы на форме бы не было.. Не найдя его для FMX, я и стал искать что-то похожее, и набрел на TTcpServer, у которого, по крайней мере мне, не удалось найти тот самый массив Connections..

За совет про кодировку - спасибо. Если потом полезут глюки - проверю!

 

xenon54, спасибо, буду пробовать!

Изменено пользователем lis
Ссылка на комментарий
  • 0

не удалось найти тот самый массив Connections.

Сам не люблю индейцев, но у TidTCPServerSocket до подключений можно достучаться так:

procedure THeaderFooterForm.btn2Click(Sender: TObject);
var
  ConnList: TList<TidContext>;
  i: Integer;
begin
  ConnList:=IdTCPServer1.Contexts.LockList;
  try
    for i := 0 to ConnList.Count-1 do
      ConnList[i].Connection.IOHandler.Write(bla-bla-bla);
  finally
    IdTCPServer1.Contexts.UnlockList;
  end;
...
Изменено пользователем kami
Ссылка на комментарий
  • 0

в самом indy 9 версии есть пример простого чата. открыл и посмотрел как это делается. так нет же. народ будет до упору писать на форуме, ждать ответа, собачится с теми кто ему что то пишет и ожидать когда же манна небесная свалится на голову в виде готового решения его проблемы. 

 

эх когда я только начинал писать на 4 делфи, никаких инетов дома не было, все изучалось по хелпам, примерам и исходникам. а сейчас обленился народ. что то делать самому, пошевелить мозгами и руками это так лениво. 

Изменено пользователем haword
Ссылка на комментарий
  • 0

вот так всегда.. задашь вопрос на форуме, и обязательно найдется нечто, которое по делу сказать ничего не сможет, но с умным видом примется писать никому ненужную ересь про мозги, хелп, гугл, и как оно само когда-то что-то накодило...

 

по теме:

мне не нужен чат, отправку строки я вполне себе сделал. мне нужно отправить массив. этого я в примерах, увы, не нашел. а собачится тут, по крайней мере до твоего вброса, никто не собачился. ребята помогали мне решить мою проблему, за что им огромное спасибо. кстати, форум для того и нужен, для помощи в решении вопросов. при чем тут манна? :blink:

 

резюмирую: если есть чего сказать по делу - буду очень признателен. если нет - иди ты в... хелп ^_^

 

 

ну и конечно же, бессмертное:

американский форум задаешь вопрос получаешь ответ.
Израильский форум задаешь вопрос тебе отвечают но вопросом на вопрос.
Русский форум  задаешь вопрос и тебе долго и нудно объясняют какой ты ч(м)удак.

:lol:

Изменено пользователем lis
Ссылка на комментарий
  • 0

Что получилось в итоге

unsigned char MessageToController[12];
/*заполняем MessageToController*/
TMemoryStream *t = new TMemoryStream;
// t->SetSize(12);
// t->Clear();
t->Write(MessageToController, 12);
t->Position = 0;
IdCmdTCPClient1->Socket->WriteBufferClear();
IdCmdTCPClient1->Socket->WriteBufferOpen();
IdCmdTCPClient1->Socket->Write(t,12,true);
IdCmdTCPClient1->Socket->WriteBufferClose();

все отсылается, wireshark тому свидетель, но почему-то добавляется 4 байта перед моим массивом (00 00 00 0С), видимо длина посылки. И я так полагаю именно из за этой приставки сервер меня отключает, и я получаю 10054 ошибку. Можно ли префикс этот убрать как-то?

Изменено пользователем lis
Ссылка на комментарий
  • 0

кто то задает вопросы а кто то вые что ему не так отвечают или тянут с ответом офигевшие посетители форума.

 

для тех кто слышит и хочет понять о чем речь, пример с чатом был для того что бы уяснить как работать с сокетами. особенно полезно для тех кто пытается в серверном сокете передать данные клиенту через обычный вызов write компонента, не удосужившись понять что и как вообще работает и как надо передавать данные клиенту. 

Изменено пользователем haword
Ссылка на комментарий
  • 0
  • Администраторы

Ребята, форум существует для ответов на любые вопросы. Если вы считаете, что автор вопроса поленился и не захотел попробовать найти информацию, НЕ пишите и не отвечайте ему, если вам не хочется. Чем разводить бессмысленные словесные перепалки. Эмоции здесь совершенно ни к чем.

 

Спасибо за понимание

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

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