TcpClient и TcpServer.
Мне надо организовать такую систему:
множество программ-клиентов должно подключаться к серверу, и сервер должен выполнять их запросы. Мне, соответственно, надо написать программу для клиента и для сервера. Вопрос упирается в пересылку сообщений по сети.
Всё взаимодействие предполагается сделать на основе компонентов TcpServer и TcpClient.
У меня только поверхностное представление, как они работают: клиент обращается к серверу (IP-адрес, порт); сервер открывает новый порт и дальше клиент общается уже с ним.
Может кто-нибудь знает, как конкретно это реализуется на Delphi? Перечислите вкратце что нужно делать, или подскажите где взять русскоязычное описание этих компонентов.
Заранее спасибо!
[email]DLR-0000@yandex.ru[/email]
КЛИЕНТ:
Для компонента TcpClient устанавливаю свойства BlockMode:=bmBlocking, RemoteHost:='127.0.0.1' и RemotePort:='3000' (слушающий порт моего локального сервера). Вызываю Connect.
А потом: TcpClient1.sendln('сообщение серверу'); s:=TcpClient1.receiveln; Memo1.lines.add(s);
СЕРВЕР:
Для компонента TcpServer устанавливаю свойства BlockMode:=bmThreadBlocking, LocalHost:='127.0.0.1' и LocalPort:='3000'. Вызываю Open.
Пишу обработчик OnAccept: в нем просто вызывается процедура обработки OBRABOTKA(ClientSocket); (OnAccept как я понимаю, выполняется отдельным потоком (реентерабельна))
Сама процедура обработки такова:
procedure OBRABOTKA(cl: TCustomIpClient);
var s:string;
begin
while cl.Connected do // !!! это не очень-то срабатывает!!!
begin
s:=cl.Receiveln();//читаем сообщение клиента
if s='' then continue; // !!! я не знаю, в каком случае s='' (но когда клиент сделал Disconnect, получается именно так)
Form1.Memo1.Lines.Add(s);
cl.Sendln('Ok! '+cl.RemoteHost+' : '+cl.RemotePort);//шлем ответ клиенту
end;
end;
!!!OnAccept возникает каждый раз, когда клиент делает Connect (и ClientSocket создаётся каждый раз новый и его свойства (порт и IP) сами устанавливаются). Для каждого нового клиента вызывается процедура OBRABOTKA. Процедура обработки блокируется пока ReceiveLn не выполнится. Но все такие процедуры работают паралельно и друг друга не блокируют. В моём случае просто надо учесть, чтобы при каждом вызове процедуры обработки для нового соединения использовать отдельную область данных (т.е. без статических переменных).
Вопрос: while cl.connected не срабатывает!!! Как определить, что клиент сделал Disconnect (или провод порвался, например) - чтобы выйти из цикла обработки ?????
Еще вопрос: Если действительно для OnAccept создается новый поток, то это наверное забирает какие-то ресурсы и КАК-ТО может быть надо этот поток завершать самому по окончании обработки, или нет ?
И еще: здесь устроен цикл опроса, а нельзя ли использовать механизм событий для приема сообщений сервером ????
P.S.: Из-за блокировки (а с многопоточностью я еще не разобрался) КЛИЕНТ и СЕРВЕР в таком виде должны быть выполнены в виде отдельных приложений.