Оформил: DeeCo
Автор: CyANiD
Конечно, перед вами наверняка вставала
проблема организации связи, ну или хотя бы вы желали установить её для разных
целей..:)
Я попробую вам помочь. Для
плодотворной работы у вас должны быть хоть какие-нибудь навыки программирования
на Delphi, вы должны хоть чуть-чуть знать о TCP/IP и как это работает, ну и
самое главное - сокеты. Может конечно попозже вы разберетесь, что это такое, но
эту статью я рассчитываю на тех людей, кто хоть слышал это слово...
Программируя на Delphi, я писал
различные программы, но вскоре стал интересоваться, как организовать связь между
компьютерами, как переслать информацию. Стал лазить по всей палитре компонентов
и увидел что-то похожее на розетку, в которую втыкают шнур, и розетку, которую
очень бережно держит чья-то рука. Как потом после чтения Help'а оказалось, что
это компоненты для работы с сокетами. На тот момент я уже имел представления о
них, поэтому понял сразу, что это то, что мне нужно. Эти компоненты называются
TClientSocket и TServerSocket. Как понятно из названий, один обеспечивает
серверную часть, другой клиентскую.
Чтобы подсоединить клиент к серверу,
клиенту необходимо указать адрес сервера (IP-адрес или имя). Это свойства
Address (IP) и Host (Имя). В целом присоединиться можно только по одному
параметру, но по IP - быстрее. Сами подумайте почему...
Еще одним главным параметром является
рабочий порт сервера. Кстати заметьте, что в TServerSocket его необходимо
указывать тоже. Как уже наверное вы поняли, указанный порт в клиенте должен
совпадать с портом, указанного у сервера. Для обычной связи остальные параметры
можно не менять. Я бы сказал их вообще лучше даже не менять.
Возникает резонный вопрос, так как все
же присоединиться. Чтобы это осуществить, сначала запускаем сервер. Делаеться
это просто: в обработчике событий (любом, будь то onClick или onCreate) пишем
"ServerSocket1.Active:=True;". Тем самым мы запустили сервер. Чтобы присоединить
клиент делаем тоже самое для TClientSocket.
Какие события обрабатываются при
подсоединении, отсоединении, ошибке, я думаю вы поймете сами. Интересней, какие
события возникают при получении информации. Когда сервер получает информацию
обрабатываеться onClientRead, хотя интуиция склоняет в сторону onClientWrite.
Здесь она неправа. procedure TForm1.ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket); var Str: string; RemIP: string; begin RemIP := Socket.RemoteAddress; Str := Socket.ReceivedText; end;
После этого в переменной Str
содержится полученное сообщение(текстовое), а в переменной RemIP - адрес
отправителя сообщения.
Для посылки сообщения с сервера
клиентам следует написать процедуру procedure TForm1.SendMes(Text: String);
var i: byte; begin with ServerSocket1.Socket do begin if ActiveConnections> 0 then for i := 0 to ActiveConnections - 1 do try Connections[i].SendText(Text); Application.ProcessMessages; except // end; end; {/WITH} end;
ServerSocket1.Socket.Connections - это
массив всех сокетных соединений. Можно конечно работать с каждам
отдельно...
У TClientSocket дело обстоит примерно
также, поэтому описывать его не стану. Скажу, что у клиента при получении
информации обрабатываеться onRead...
Позже напишу
статью о том, как пересылать через сокеты любую информацию, не только текстовую,
а также как пересылать потоки... |