Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.10.25;
Скачать: CL | DM;

Вниз

TspClient и TspServever   Найти похожие ветки 

 
kostyl_kostyl   (2009-08-12 12:38) [0]

Добрый день. Прошу показать пример обмена сообщениями сервера и клиента с помощью этих компонентов. У меня не выходит.
Я пишу:

procedure TForm1.TcpServer1Accept(Sender: TObject;
 ClientSocket: TCustomIpClient);
begin
 TcpServer1.Sendln("Ответ");
end;
//-----
 if TcpClient.Connect then
 begin
   TcpClient.Sendln("Запрос");
   Response := TcpClient.Receiveln;
   ShowMessage(Response);
 end
 else
   ShowMessage("Нет ответа");
 TcpClient.Disconnect;    

В лучшем случае  выдает пустую строку. В худшем зависает на Response := TcpClient.Receiveln;. Помогите разобраться.
Заранее благодарю.


 
Palladin ©   (2009-08-12 12:50) [1]


> TForm1.TcpServer1Accept

и чем же ты руководствовался при выборе события?


 
Сергей М. ©   (2009-08-12 12:54) [2]


> kostyl_kostyl


Снрвер призван обслуживать множество клиентов.

Возникает вполне резонный вопрос: какому конкретно клиенту из этого множества ты отправляешь сообщение в строчке

TcpServer1.Sendln("Ответ");

?


 
Сергей М. ©   (2009-08-12 12:56) [3]


> procedure TForm1.TcpServer1Accept(Sender: TObject;
>  ClientSocket: TCustomIpClient);


Если звезды на небе зажигают, значит они кому-то нужны, не так ли ?
Если так, то почему у тебя не возник вполне резонный интерес к этому параметру ?


 
Dennis I. Komarov ©   (2009-08-12 13:01) [4]


kostyl_kostyl   (12.08.09 12:38)  
> procedure TForm1.TcpServer1Accept(Sender: TObject;
>  ClientSocket: TCustomIpClient);



>    TcpClient.Sendln("Запрос");

И где оно обрабатывается?


 
kostyl_kostyl   (2009-08-12 13:02) [5]

А...
Переписал так:

procedure TForm1.TcpServer1Accept(Sender: TObject;
 ClientSocket: TCustomIpClient);
begin
 ClientSocket.Sendln("Ответ");
end;

Нет ответа. Наверно клиенту надо подождать как о или как?


 
Сергей М. ©   (2009-08-12 13:08) [6]


> Наверно клиенту надо подождать


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


 
kostyl_kostyl   (2009-08-12 13:10) [7]


> Вряд ли он чего-либо дождется

Если делаю так в сервере

ClientSocket.Sendln("Ответ");
Sleep(2000);

тогда получаю.
А как определить отправлен ли ответ?


 
Сергей М. ©   (2009-08-12 13:13) [8]


> как определить отправлен ли ответ?


Давай определимся - так ли уж нужно, чтобы соединение разрывалось по инициативе именно сервера ?


 
kostyl_kostyl   (2009-08-12 13:16) [9]

Нет его дело послать ответ. Дело клиента дождаться ответа, если нет ответа, то делать че-то дальше.


 
Сергей М. ©   (2009-08-12 13:20) [10]

В обработчике OnAccept следует организовать цикл вида:

пока соединение существует делать
начало
  дождаться и получить запрос
  обработать полученный запрос
  отправить ответ-результат обработки запроса
конец


 
kostyl_kostyl   (2009-08-12 13:27) [11]


procedure TForm1.TcpServer1Accept(Sender: TObject;
 ClientSocket: TCustomIpClient);
begin
 while ClientSocket.Connected do
 begin
   if ClientSocket.Receiveln <> "" then
   begin
     ClientSocket.Sendln("Ответ");
   end;  
 end;
end;

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


 
Palladin ©   (2009-08-12 13:29) [12]


> [10] Сергей М. ©   (12.08.09 13:20)

хм...

After the server socket accepts the connection, the client socket completes the connection, and an OnConnect event occurs for the client socket.

чего я не понимаю?


 
Сергей М. ©   (2009-08-12 13:37) [13]


> Так чтоли?


Ну да, примерно так.


> Если несколько серверов слушают один порт


Это еще умудриться надо, чтобы заставить несколько серверов слушать на одном и том же адресе:порту


 
Сергей М. ©   (2009-08-12 13:38) [14]


> Palladin ©   (12.08.09 13:29) [12]


Ты куда-то не туда смотришь..
У TTCPServer нет события OnConnect.


 
kostyl_kostyl   (2009-08-12 13:40) [15]


> Ну да, примерно так

А я вайлом не повешу сервер?


 
Palladin ©   (2009-08-12 13:41) [16]


> [14] Сергей М. ©   (12.08.09 13:38)

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


 
Сергей М. ©   (2009-08-12 13:43) [17]


> Palladin ©   (12.08.09 13:41) [16]


А.. ну да ..

Ну дык а какое дело серверу до событий на стороне клиента ?


 
kostyl_kostyl   (2009-08-12 13:44) [18]


> пока на сервере не отработает OnAccept

Кстати да. Я это заметил когда писал туда ShowMessage...


 
Сергей М. ©   (2009-08-12 13:46) [19]


> я вайлом не повешу сервер?


Не повесишь.


 
Сергей М. ©   (2009-08-12 13:47) [20]


> писал туда ShowMessage


Нельзя туда писать ShowMessage при BlockMode = bmThreadblocking !


 
kostyl_kostyl   (2009-08-12 13:50) [21]


> Не повесишь.

Аргументы? У меня же клиентов много. Могут не достучаться наверно ж?


 
Palladin ©   (2009-08-12 14:12) [22]


>  [17] Сергей М. ©   (12.08.09 13:43)

ну тык он(сервер) посылает, то в OnAccept, а клиент то еще даже не в курсе что соединение установилось... куда там чего прийдет на клиенте...


 
Dennis I. Komarov ©   (2009-08-12 14:12) [23]


> if ClientSocket.Receiveln <> "" then

Вот сдесь, все что получил твой сервер кануло в небытие, или ему не важно что какой-то клиент там чего-то прислал?


> Аргументы? У меня же клиентов много. Могут не достучаться
> наверно ж?

А какие нужны? Напиши и посмотри если не веришь...


 
Сергей М. ©   (2009-08-12 14:15) [24]


> Аргументы?


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


 
Сергей М. ©   (2009-08-12 14:16) [25]


> У меня же клиентов много


Сколько конкретно ?)


 
kostyl_kostyl   (2009-08-12 14:25) [26]


> Сколько конкретно ?)

Десяток. Это я сказал, указывая что не один.

> Вот сдесь, все что получил твой сервер кануло в небытие

И что делать то? Как правильно?


 
Сергей М. ©   (2009-08-12 14:29) [27]


> Десяток


Десяток - это курам на смех.
Серьезные проблемы возникнут при тысяче-другой клиентов.


 
Dennis I. Komarov ©   (2009-08-12 14:32) [28]


> И что делать то? Как правильно?

Очевидно, что перед тем как сравнивать, надо сохранить куда-нить полученное...


 
kostyl_kostyl   (2009-08-12 14:36) [29]


> Dennis I. Komarov ©   (12.08.09 14:32) [28]

А.., типа Get чистит буфер?


 
Dennis I. Komarov ©   (2009-08-12 14:46) [30]


> А.., типа Get чистит буфер?

Кто, где, кого чистит?


 
kostyl_kostyl   (2009-08-12 14:49) [31]

Когда я делаю там if ClientSocket.Receiveln <> "" и условие выполняется у меня уже в ClientSocket.Receiveln ничего не будет?


 
Dennis I. Komarov ©   (2009-08-12 14:51) [32]

А как думаешь, что из себя есть ClientSocket.Receiveln?


 
Сергей М. ©   (2009-08-12 15:01) [33]


> уже в ClientSocket.Receiveln ничего не будет?
>


Да.
Все что на момент этого вызова находилось во внутреннем буфере принимаемых данных, ты этим вызовом оттуда вычерпал. И если нигде не сохранил, то навсегда потерял.


 
kostyl_kostyl   (2009-08-12 15:03) [34]


> А как думаешь, что из себя есть ClientSocket.Receiveln?

Пока склоняюсь к мнению что регистр проца. А вообще без понятия.


 
Сергей М. ©   (2009-08-12 15:15) [35]


> склоняюсь к мнению что регистр проца


Интересно, на чем основано такое мнение ?
Вероятно на том что в проце якобы есть какие-то там "регистры" какого-то там невероятно большого размера ?)


 
Dennis I. Komarov ©   (2009-08-12 15:21) [36]


> Пока склоняюсь к мнению что регистр проца.

Ёёёёёё... какие слова страшные %)

> А вообще без понятия.

А посмотреть не судьба?


 
kostyl_kostyl   (2009-08-12 15:21) [37]


> Вероятно на том что в проце якобы есть какие-то там "регистры"
> какого-то там невероятно большого размера ?)

Ну не знаю я. А мнение такое потому что я подумал  что там ссылка на порт лежит. А вроде когда порт читается  из него данные изчезают. Я видел схему когдато...


 
Dennis I. Komarov ©   (2009-08-12 15:23) [38]


> kostyl_kostyl   (12.08.09 15:21) [37]

Овсянка в голове, сэр...


 
Сергей М. ©   (2009-08-12 15:36) [39]


> там ссылка на порт лежит


"Там" - это где ?)


 
kostyl_kostyl   (2009-08-12 15:37) [40]


> Peek at the incoming data. The data is copied into the buffer but is not removed from the input queue



Страницы: 1 2 3 4 вся ветка

Текущий архив: 2009.10.25;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.023 c
2-1251683194
Johnnnn
2009-08-31 05:46
2009.10.25
Цветной текст ДЛЯ richedit?


15-1250592835
abun
2009-08-18 14:53
2009.10.25
Backdoor.Hupigon.bnln и Heuristic.BehavesLike.Win32.O - что это??


15-1250752659
Павел Калугин
2009-08-20 11:17
2009.10.25
Методика тестирования програмного обеспечения


8-1198524383
XeON
2007-12-24 22:26
2009.10.25
Вырезать часть картинки


2-1251374237
cyber-pilot
2009-08-27 15:57
2009.10.25
Пропадают вкладки в PageControl е