Форум программистов, компьютерный форум, киберфорум
Delphi: Сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
2 / 2 / 0
Регистрация: 02.03.2012
Сообщений: 66
RAD 2009-XE2

TCP клиент

04.02.2019, 09:25. Показов 1672. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток! Необходимо подключится к серверу, отправить команду и отключится и реализовать это одной функцией. Делаю так:
Delphi
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
function Command: boolean
with ClientSocket do begin
   Port:= StrToInt(PortEdit.Text);
   Host:= HostEdit.Text;
   Active := True;
  if Socket.Connected then begin
   senddata:='';
   StrTmpLen:= ''; 
   StrTmp1  := '0103505552';              
   StrTmpRes:= StrTmp1;
   len1:= IntToHex(Length(StrTmpRes) div 2,4);
   StrTmpRes:= len1 + StrTmpRes ;
   senddata:='';
   SetLength(a, (Length(StrTmpRes) div 2));
   j := 1;
   for i := 0 to High(a) do begin
     a[i] := StrToInt( '$' + Copy(StrTmpRes, j, 2) );
     j := j + 2;
     pp:=Ord(a[i]);
   end;
   for I := 0 to Length(a)-1 do begin
    senddata:=senddata+Chr(a[i]);
   end;
   Socket.SendText(senddata);
  end;
Принимаю данные так:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
procedure TForm1.ClientSocketRead(Sender: TObject; Socket: TCustomWinSocket);
var
 i:Integer;
 len: Integer;
 p1:PByte;
begin
 try
  len:=Socket.ReceiveLength;
  if Socket.ReceiveLength<=0 then Exit;
   SetLength(BufArr,Socket.ReceiveLength);
   i:=Socket.ReceiveBuf(BufArr[0],Length(BufArr));
   SetLength(Arr,len);
   p1:=@Arr[0];
   p1:=PByte(Cardinal(p1)+BytesCount);
   Move(BufArr[0],p1^,i);
  except on e: Exception do begin
   ShowMessage(e.Message);
  end;
 end;
end;
1. т.к. подключение происходит не сразу, то функция "Command" срабатывает только со второго раза, как установить задержку при подключении к серверу.

2. Как мне реализовать прием ответа от сервера в этой же функции, для того чтобы по ответу устанавливать результат функции.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.02.2019, 09:25
Ответы с готовыми решениями:

TCP/IP сервер - клиент
Здравствуйте, я 3 дня уже ищу книги, статьи, исходники программ с использованием протокола TCP/IP. Я думаю, что меня скоро гугл забанит за...

Обмен данными клиент-сервер TCP
Доброго дня! Столкнулся с проблемкой при обмене инфой по IdTCPClient и IdTCPServer, ситуевина такая: Сервер: begin ...

TCP клиент: Не получается принять сообщение от сервера
Добрый день, хочу попробовать реализовать на Indy обмен с сервером. Я ему посылаю сообщение, он мне сразу же отвечает. ... if not...

5
882 / 404 / 173
Регистрация: 20.10.2016
Сообщений: 1,828
04.02.2019, 10:32
1. Отправку данных надо осуществлять по событию OnWrite ClientSocket'a. До этого события слать что-то в сокет смысла не имеет.

2. Поясните, в какой это "той же функции"? Прием у клиента будет осуществляться в соыбтии OnRead, и нигде более. Оттуда уже информацию можете передавать куда захочется.
0
2 / 2 / 0
Регистрация: 02.03.2012
Сообщений: 66
04.02.2019, 11:41  [ТС]
Мне хотелось бы, чтобы вся работа была в функции "Command". Для того чтобы можно было ее вызвать так:
if Command then begin
// Команда выполнена или команда не выполнена
// (по ответу от клиента или по таймауту если сервер ничего не ответил...)
end;

Добавлено через 6 минут
Вроде этого, только ответ от сервера приходит с задержкой примерно 5 сек...
Delphi
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
function Command: boolean
with ClientSocket do begin
   Port:= StrToInt(PortEdit.Text);
   Host:= HostEdit.Text;
   Active := True;
  if Socket.Connected then begin
   senddata:='';
   StrTmpLen:= ''; 
   StrTmp1  := '0103505552';              
   StrTmpRes:= StrTmp1;
   len1:= IntToHex(Length(StrTmpRes) div 2,4);
   StrTmpRes:= len1 + StrTmpRes ;
   senddata:='';
   SetLength(a, (Length(StrTmpRes) div 2));
   j := 1;
   for i := 0 to High(a) do begin
     a[i] := StrToInt( '$' + Copy(StrTmpRes, j, 2) );
     j := j + 2;
     pp:=Ord(a[i]);
   end;
   for I := 0 to Length(a)-1 do begin
    senddata:=senddata+Chr(a[i]);
   end;
   Socket.SendText(senddata);
// таймаут...
  len:=Socket.ReceiveLength;
  if Socket.ReceiveLength<=0 then Exit;
   SetLength(BufArr,Socket.ReceiveLength);
   i:=Socket.ReceiveBuf(BufArr[0],Length(BufArr));
   SetLength(Arr,len);
   p1:=@Arr[0];
   p1:=PByte(Cardinal(p1)+BytesCount);
   Move(BufArr[0],p1^,i);
  if BufArr[0]=15 then result:= false;
  end;
и как обрабатывать если через 10 сек. нету ответа?
0
882 / 404 / 173
Регистрация: 20.10.2016
Сообщений: 1,828
04.02.2019, 11:54
Цитата Сообщение от zurprog Посмотреть сообщение
и как обрабатывать если через 10 сек. нету ответа?
Объясните, зачем нужно такое специфическое решение? У вас классическая ситуация с событиями. Отправка сообщения в OnWrite, и какие-то действия в OnRead. Поэтому
Delphi
1
2
3
4
if Command then begin
// Команда выполнена или команда не выполнена
// (по ответу от клиента или по таймауту если сервер ничего не ответил...) 
end;
превосходно превращается в
Delphi
1
2
3
4
5
6
Form1.OnRead(Sender:TObject; Socket:...);
begin
// Получаем команду. 
//Команда выполнена или команда не выполнена
Timer1.Enabled := false;
end;
Таймер же вполне можно запустить в OnWrite, выставив ему время ожидание в 10000 мс, например. И так же, по событию таймера сообщать, что от сервера нет данных.

Вы идете не в ту сторону. Она заведет вас в тупик и значительно (очень и очень значительно!) ухудшит читабельность и удобность кода.
0
2 / 2 / 0
Регистрация: 02.03.2012
Сообщений: 66
04.02.2019, 20:06  [ТС]
Не особо понимаю как это делать...

я команду серверу отправляю функцией "Command" , а результат (т.е. ответ от сервера) получаю из onRead?
Delphi
1
2
3
4
5
6
7
8
9
10
procedure TForm1.btn2Click(Sender: TObject);
var
res: boolean;
begin
res:= Command;
if res then 
showmessage('Команда принята')
else
showmessage('Команда не принята/нет ответа от сервера')
end;
0
882 / 404 / 173
Регистрация: 20.10.2016
Сообщений: 1,828
05.02.2019, 06:24
Цитата Сообщение от zurprog Посмотреть сообщение
я команду серверу отправляю функцией "Command" , а результат (т.е. ответ от сервера) получаю из onRead?
Если опустить подробности, то да. Поскольку ответ может идти обратно значительное время (а может и вообще не придти), то блокировать приложение в ожидании этого самого ответа - не лучший вариант. Поэтому и разделили отправку и прием данных. Поэтому выглядеть это будет так:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Form1.OnWrite(Sender:TObject; Socket:...);
begin
// Отправляем
Timer1.Enabled := true;
end;
 
Form1.OnRead(Sender:TObject; Socket:...);
begin
//Получаем данные
...
// Получили
showmessage('Команда принята')
Timer1. Enabled := false;
end;
 
Form1.Timer1OnTimer(Sender:TObject);
begin
showmessage('Команда не принята/нет ответа от сервера')
end;
Привыкайте к работе с событиями. Иначе то, что может быть сделано за милисекунды у вас будет обрабатываться минутами.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.02.2019, 06:24
Помогаю со студенческими работами здесь

TCP/IP клиент-сервер (не знаю как отправить текст от сервера к клиенту)
Помогите пожалуйста научился отправлять от клиента к серверу но наоборот никак не получается пожалуйста помогите. До сдачи осталось 3 дня

TCP-сервер и TCP-клиент. Клиент не находит файл.
Всем привет! Решил изучать передачу данных по сети и начал с освоения примера, приведённого в книге &quot;Visual C# 2008. Базовый курс...

Сцена зависает при запуске TCP-клиента, когда он подключен к TCP - серверу, при этом TCP-клиент полностью функционирует
Проблема описана в заголовке, и хотелось бы услышать ваше мнение, о том как можно решить проблему. Скрипт TCP-клиента на сцене: ...

Если сервер TCP то и клиент тоже должен быть TCP?
Я полный новичок И я так понимаю есть TCP client (Sockets), TCP server (Sockets), и ClientSocket (ScktComp), ServerSocket (ScktComp) ...

Не приходит ответ на TCP клиент андроид с TCP сервера Qt
У меня есть TCP клиент андроид и TCP сервер Qt с клиента на сервер сообщения доходят нормально. Ну а с сервера на клиент сообщения(ответы)...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru