Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2009.10.25;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.54 MB
Время: 0.048 c
4-1219984247
Melphin
2008-08-29 08:30
2009.10.25
Изменение свойств компонентов в Excel


2-1251711913
Tinky
2009-08-31 13:45
2009.10.25
Проверить integer на вхождение во множество


3-1228725725
amadey_motzart
2008-12-08 11:42
2009.10.25
ADOQuery


4-1219732438
KygECHuK
2008-08-26 10:33
2009.10.25
Выгрузка WinApi перехватчика


2-1251375733
Кирей
2009-08-27 16:22
2009.10.25
редактор отчетов





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский