![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TspClient и TspServever [D7, XP]
kostyl_kostyl © (2009-08-12 12:38:00)Добрый день. Прошу показать пример обмена сообщениями сервера и клиента с помощью этих компонентов. У меня не выходит.
Я пишу:
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;. Помогите разобраться.
Заранее благодарю.
kostyl_kostyl (2009-08-12 13:40:00) [141]
> Ну да, примерно так
А я вайлом не повешу сервер?
Сергей М. (2009-08-12 13:38:00) [142]
> Palladin © (12.08.09 13:29) [12]
Ты куда-то не туда смотришь..
У TTCPServer нет события OnConnect.
Сергей М. (2009-08-12 13:37:00) [143]
> Так чтоли?
Ну да, примерно так.
> Если несколько серверов слушают один порт
Это еще умудриться надо, чтобы заставить несколько серверов слушать на одном и том же адресе:порту
Palladin (2009-08-12 13:29:00) [144]
> [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.
чего я не понимаю?
kostyl_kostyl (2009-08-12 13:27:00) [145]
procedure TForm1.TcpServer1Accept(Sender: TObject;
ClientSocket: TCustomIpClient);
begin
while ClientSocket.Connected do
begin
if ClientSocket.Receiveln <> '' then
begin
ClientSocket.Sendln('Ответ');
end;
end;
end;
Так чтоли?
Еще такой вопрос. Если несколько серверов слушают один порт может быть проблема когда только один отправляет ответ а для других запрос не приходит? Если да то как избежать этого?
Сергей М. (2009-08-12 13:20:00) [146]В обработчике OnAccept следует организовать цикл вида:
пока соединение существует делать
начало
дождаться и получить запрос
обработать полученный запрос
отправить ответ-результат обработки запроса
конец
kostyl_kostyl (2009-08-12 13:16:00) [147]Нет его дело послать ответ. Дело клиента дождаться ответа, если нет ответа, то делать че-то дальше.
Сергей М. (2009-08-12 13:13:00) [148]
> как определить отправлен ли ответ?
Давай определимся - так ли уж нужно, чтобы соединение разрывалось по инициативе именно сервера ?
kostyl_kostyl (2009-08-12 13:10:00) [149]
> Вряд ли он чего-либо дождется
Если делаю так в сервере
ClientSocket.Sendln('Ответ');
Sleep(2000);
тогда получаю.
А как определить отправлен ли ответ?
Сергей М. (2009-08-12 13:08:00) [150]
> Наверно клиенту надо подождать
Вряд ли он чего-либо дождется - твой сервер поставив, сообщение в очередь на отправку, практически тут же разрывает соединение с клиентом, не дождавшись фактической отправки.
kostyl_kostyl (2009-08-12 13:02:00) [151]А...
Переписал так:
procedure TForm1.TcpServer1Accept(Sender: TObject;
ClientSocket: TCustomIpClient);
begin
ClientSocket.Sendln('Ответ');
end;
Нет ответа. Наверно клиенту надо подождать как о или как?
Dennis I. Komarov (2009-08-12 13:01:00) [152]
kostyl_kostyl (12.08.09 12:38)
> procedure TForm1.TcpServer1Accept(Sender: TObject;
> ClientSocket: TCustomIpClient);
> TcpClient.Sendln('Запрос');
И где оно обрабатывается?
Сергей М. (2009-08-12 12:56:00) [153]
> procedure TForm1.TcpServer1Accept(Sender: TObject;
> ClientSocket: TCustomIpClient);
Если звезды на небе зажигают, значит они кому-то нужны, не так ли ?
Если так, то почему у тебя не возник вполне резонный интерес к этому параметру ?
Сергей М. (2009-08-12 12:54:00) [154]
> kostyl_kostyl
Снрвер призван обслуживать множествоклиентов.
Возникает вполне резонный вопрос: какому конкретноклиенту из этого множества ты отправляешь сообщение в строчке
TcpServer1.Sendln('Ответ');
?
Palladin (2009-08-12 12:50:00) [155]
> TForm1.TcpServer1Accept
и чем же ты руководствовался при выборе события?