Форум: "Начинающим";
Текущий архив: 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.046 c