Diplom Consult.ru
SendBuf(var Buf; Count: Integer) — Посылка буфера через сокет. Буфером может являться любой тип, будь то структура (record), либо простой Integer. Буфер указывается параметром Buf, вторым параметром Вы должны указать размер пересылаемых данных в байтах (Count);
SendText(const S: string)— Посылка текстовой строки через сокет.
SendStream(AStream: TStream)— Посылка содержимого указанного потока через сокет. Пересылаемый поток должен быть открыт. Поток может быть любого типа — файловый, из ОЗУ, и т.д.
ReceiveBuf (var Buf; Count: Integer)— Прием данных в буферBuf, размеромCount. Важно знать, что при попытке чтения большего количества данных чем доступно на данный момент – возникнет ошибка чтения с сокета. Количество данных (в байтах), доступных для чтения с сокета, можно узнать в свойствеReceiveLength.
Для чтения простых данных с сокета можно воспользоваться свойством ReceiveText.
Работа с серверными сокетами (tServerSocket)
Сервер, основанный на сокетах, позволяет обслуживать сразу множество клиентов. Причем, ограничение на их количество вы можете указать сами (или вообще убрать это ограничение, как это сделано по умолчанию). Для каждого подключенного клиента сервер открывает отдельный сокет, по которому Вы можете обмениваться данными с клиентом.
Основные этапы работы с tServerSocket
1) Определение свойств Port и ServerType — чтобы к серверу могли нормально подключаться клиенты, нужно, чтобы порт, используемый сервером точно совпадал с портом, используемым клиентом (и наоборот). СвойствоServerTypeопределяет тип подключения (подробнее см.ниже);
2) Открытие сокета— открытие сокета и указанного порта. Здесь выполняется автоматическое начало ожидания подсоединения клиентов (Listen);
3) Подключение клиента и обмен данными с ним— здесь подключается клиент и идет обмен данными с ним.
4) Отключение клиента— Здесь клиент отключается и закрывается его сокетное соединение с сервером.
5) Закрытие сервера и сокета— По команде администратора сервер завершает свою работу, закрывая все открытые сокетные каналы и прекращая ожидание подключений клиентов.
Следует заметить, что пункты 3-4 повторяются многократно, т.е. эти пункты выполняются для каждого нового подключения клиента.
Основные свойства компонента TServerSocket
Класс TServerWinSocket, через который Вы имеете доступ к открытым сокетным каналам. Далее мы рассмотрим это свойство более подробно, т.к. оно, собственно и есть одно из главных.
Тип сервера. Может принимать одно из двух значений: stNonBlocking— синхронная работа с клиентскими сокетами. При таком типе сервера Вы можете работать с клиентами через событияOnClientReadиOnClientWrite.stThreadBlocking— асинхронный тип. Для каждого клиентского сокетного канала создается отдельный процесс (Thread).
Количество клиентских процессов (Thread), которые будут кэшироваться сервером. Здесь необходимо подбирать среднее значение в зависимости от загруженности Вашего сервера. Кэширование происходит для того, чтобы не создавать каждый раз отдельный процесс и не убивать закрытый сокет, а оставить их для дальнейшего использования.
Показатель того, активен в данных момент сервер, или нет. Т.е., фактически, значение True указывает на то, что сервер работает и готов к приему клиентов, а False— сервер выключен. Чтобы запустить сервер, нужно просто присвоить этому свойству значениеTrue.
Номер порта для установления соединений с клиентами. Порт у сервера и у клиентов должны быть одинаковыми. Рекомендуются значения от 1025 до 65535, т.к. от 1 до 1024 — могут быть заняты системой.
Основные методы компонента TServerSocket
Запускает сервер. По сути, эта команда идентична присвоению значения TrueсвойствуActive
Останавливает сервер. По сути, эта команда идентична присвоению значения FalseсвойствуActive
Основные события компонента TServerSocket
Возникает, когда клиент установил сокетное соединение и ждет ответа сервера (OnAccept)
Возникает, когда клиент отсоединился от сокетного канала
Возникает, когда клиент передал серверу какие-либо данные. Доступ к этим данным можно получить через передаваемый параметр Socket: TCustomWinSocket
Возникает, когда сервер может отправлять данные клиенту по сокету
В обработчике этого события Вы можете отредактировать параметр ClientSocket
В обработчике этого события Вы можете определить уникальный процесс (Thread) для каждого отдельного клиентского канала, присвоив параметру SocketThread нужную подзадачу TServerClientThread
Возникает, когда подзадача (процесс, Thread) запускается
Возникает, когда подзадача (процесс, Thread) останавливается
Возникает, когда сервер принимает клиента или отказывает ему в соединении
Возникает, когда сервер переходит в режим ожидания подсоединения клиентов
Простой способ отправки файлов при помощи tclientsocket & tserversocket
В этом уроке я покажу вам, как можно создавать различные сетевые приложения на Delphi с использованием компонентов TServerSocket и TClientSocket. Данный урок поможет вам в разработке своих программ или компьютерных игр, которые смогут взаимодействовать посредством локальной или сети Интернет.
Для начала давайте найдем необходимые компоненты TServerSocket и TClientSocket. Чаще всего они не входят в стандартный пакет установки Delphi, но их можно установить дополнительно. Для этого запустим Delphi, зайдем в «Component/Install Packages», затем нажмем кнопку «Add». В открывшемся диалоговом окне нужно найти файл «dclsocketsXX.bpl» (он лежит в папке bin, которая находится в папке с Delphi), где XX — это числовой номер версии вашего Delphi. Находим файл, нажимаем «Открыть», а затем в окне «Install Packages» нажимаем «OK».
Теперь, во вкладке «Internet» появились два компонента — TServerSocket и TClientSocket, работу с которыми мы и будем рассматривать в этом уроке.
Не сложно догадаться по названиям самих компонентов, что компонент TClientSocket выполняет роль клиента в сети, который подсоединяется к серверу с компонентом TServerSocket.
[note]В рамках данной статьи, в качестве сервера мы будем рассматривать серверную программу, которая выполняет роль сервера, а клиентами мы будем называть клиентские программы, которые соединяются с сервером.[/note]
Сервер служит обычно для сетевого взаимодействия клиентов. Таким образом клиент может отсылать какую-либо информацию на сервер, а сервер будет эту информацию отсылать остальным клиентам.
Давайте рассмотрим работу сетевого чата. Предположим, что к серверу чата подключено несколько клиентов. Один из клиентов отправляет новое сообщение на сервер. Сервер принимает сообщение и отправляет его обратно остальным клиентам. Остальные клиенты принимают сообщение с сервера и таким образом и осуществляется передача сообщений чата.
[note]Такие сетевые приложения, в работе которых участвуют клиент и сервер, называются клиент-серверными приложениями.[/note]
Теперь попробуем разобраться, как же все таки работать с этими компонентами. Попробуем реализовать аналогичный клиент-серверный чат.
Для начала создадим сервер, который должен принимать сообщение и отсылать его всем клиентам обратно.
Создадим новое приложение в Delphi, поместим на него компонент TServerSocket и в его параметрах укажем следующие значения:
Active = false
Name = srv
Port = 22500
ServerType = stNonBlocking
Параметр Active отвечает за состояние сервера, активен он или не активен на данный момент.
В событие OnCreate формы не забудем добавить srv.active:=true, чтобы сервер запустился.
В параметре Port необходимо указать порт, по которому будут передаваться пакеты с информацией от клиента к серверу и обратно.
Также поместим на форму компонент Memo1 (дадим ему название log), который нам понадобиться для того, чтобы отслеживать работу чата.
Теперь у srv создадим событие onClientConnect, в котором мы сможем фиксировать подключения клиентов к серверу. В коде самого события напишем:
[cc lang=»delphi»]procedure TForm1.srvClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
log.Lines.Add(‘Подключился клиент с IP адресом ‘+Socket.RemoteAddress);
end;[/cc]
Таким образом мы можем узнать IP адрес подключившегося к серверу клиента.
В переменной Socket в событии хранится вся необходимая информация о клиента, который произвел подключение к серверу.
Обработчик события onClientRead служит для получения и обработки пришедшей от клиента информации. Рассмотрим пример:
[cc lang=»delphi»]procedure TForm1.srvClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
str:string;
i:integer;
begin
str:=Socket.ReceiveText;
log.Lines.Add(str);
for i:= 0 to srv.Socket.ActiveConnections -1 do
srv.Socket.Connections[i].SendText(str);
end;[/cc]
Переменной str мы присваиваем значение принятого текстового сообщения от клиента и добавляем принятое сообщение в лог. После этого мы отсылаем сообщение всем клиентам. Кол-во подключенных клиентов можно узнать в srv.Socket.ActiveConnections.
Предположим, если мы хотим отправить сообщение конкретному клиенту, то это можно сделать так:
[cc lang=»delphi»]srv.Socket.Connections[a].SendText(‘test message’); [/cc]
В данном случае в качестве переменной a выступает числовой идентификатор в srv.Socket.Connections. Эти идентификаторы находятся в диапазоне от 0 до srv.Socket.ActiveConnections -1. Но как же, например, отправить сообщение клиенту с определенным IP адресом, который нам извествен заранее? Делается это так:
[cc lang=»delphi»]for i:= 0 to srv.Socket.ActiveConnections -1 do
if srv.Socket.Connections[i].RemoteAddress= ‘123.123.123.123’ then begin
srv.Socket.Connections[i].SendText(‘test message’);
break;
end;[/cc]
Мы перебираем все соединения на сервере. Если IP адрес клиента совпадает с «123.123.123.123» (может быть и любой другой), то отправляем сообщение этому клиенту и завершаем цикл.
Ну и наконец, рассмотрим еще одно событие у TServerSocket — onClientDisconnect, которое обрабатывает отключение клиента от сервера.
[cc lang=»delphi»]procedure TForm1.srvClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
log.Lines.Add(‘Клиент ‘+socket.RemoteAddress+’ отключился от сервера.’);
end; [/cc]
Теперь перейдем к клиенту. Создадим новое приложение Delphi и поместим в него компонент TClientSocket и дадим этому компоненту имя «client». Присвоим параметрам компонента client значения:
Active = false
Port = 25500
ClientType = ctNonBlocking
Address = 127.0.0.1
В параметре address укажите IP адрес компьютера, на котором запущено серверное приложение. Если провести подключение по IP адресу «127.0.0.1», то компьютер подключится грубо говоря сам к себе и будет работать с серверной программой, которая запущена там же, где и запущена клиентская. Такой способ очень удобен для тестирования сетевых приложений.
[warning]Значение Port у клиента необходимо присвоить такое же как и у сервера! [/warning]
Также добавим компонент TMemo с именем log, чтобы отображать пришедшие от сервера сообщения.
Рассмотрим параметр OnCreate формы, где производиться подключение к серверу.
[cc lang=»delphi»]procedure TForm1.FormCreate(Sender: TObject);
begin
<Пытаемся установить соединение>
ClientSocket1.Open;
end;[/cc]
Теперь разместим на форме клиента кнопку Button1 и однострочное текстовое поле Edit1. Они нам понадобятся для отправки сообщений на сервер. В событии OnClick у компонента Button1 напишите:
Таким образом на сервер будет отправляться сообщение, введенное в Edit1.
После того как сообщение было отослано на сервер, сервер отсылает сообщение всем клиентам, поэтому нужно принять сообщение от сервера. Для этого нам понадобиться событие OnRead:
[cc lang=»delphi»]procedure ClientRead(Sender: TObject; Socket: TCustomWinSocket);
begin
<Если пришло сообщение — добавляем его в log>
Log.Lines.Add(Socket.ReceiveText);
end; [/cc]
Осталось только написать событие отключения от сервера. Для этого можем создать еще одну кнопку и в ее событии OnClick указать
[cc lang=»delphi»] client.close; [/cc]
Запустите клиент и сервер. Попробуйте отослать сообщение на сервер, сервер в ответ должен вернуть его вам. Если возникает ошибка «Asynchronous socket error 10061», то это скорее всего связано с недоступностью сервера. Проверьте соответствие портов, IP адресов и работоспособность сетевого соединения.
На этом наш урок можно считать завершенным. Смело задавайте вопросы в комментариях и подписывайтесь на рассылку новых уроков прямо на ваш e-mail!
Основные этапы работы с TServerSocket
Работа с сокетами в Delphi
Сокеты (от socket (англ.) — разъём, гнездо) — это программный интерфейс, обеспечивающий обмен информацией между процессами.
Одним из основных достоинств сокетного обмена информацией в сети можно назвать его гибкость. Главный принцип работы с сокетами состоит в отправке последовательности байт другому компьютеру, это может быть простое текстовое сообщение или файл.
Важно различать два типа сокетов: клиентские сокеты, и серверные сокеты.
Для работы с «клиентским» типом сокетов в Delphi существует компонент TClientSocket, с «серверными» сокетами можно работать при помощи компонента TServerSocket.
Установка компонентов
Зачастую компоненты TServerSocket и TClientSocket не входят в стандартный пакет установки Delphi, но их можно установить дополнительно.
Зайдите на вкладку компонентов «Internet», и проверьте присутствуют ли там компоненты TServerSocket и TClientSocket, если нет, то установите их. Зайдите в меню «Component/Install Packages», затем нажмите кнопку «Add». В открывшемся диалоговом окне нужно найти файл «dclsocketsXX.bpl» (он лежит в папке bin, которая находится в папке с Delphi), где XX — это числовой номер версии вашего Delphi. Найдите файл, нажмите «Открыть», а затем в окне «Install Packages» нажмите «OK». Теперь, во вкладке «Internet» появились два компонента — TServerSocket и TClientSocket.
Работа с клиентскими сокетами (TClientSocket)
1) Определение свойств Port и Host. Для успешного соединения свойствам Port и Host компонента TClientSocket необходимо присвоить некоторые значения. В свойстве Port нужно указать номер порта для подключения (1 – 65535, но лучше брать из диапозона 1001 – 65535, потому что номера до 1000 могут оказаться заняты системными службами).
Host — хост-имя или IP-адрес компьютера, с которым требуется соединиться. Например, rus.delphi.com или 192.128.0.0.
2) Открытие сокета.Будем рассматривать сокет как очередь символов, передающихся с одного компьютера на другой. Открыть сокет можно, вызвав метод Open (компонент TClientSocket) или присвоив значение True свойству Active. Тут нелишним будет поставить обработчик исключения на случай неудавшегося соединения.
Отправка/прием данных.
4) Закрытие сокета. По завершению обмена данными нужно закрыть сокет, вызвав метод Close компонента TClientSocket или присвоив значение False свойству Active.
Основные свойства компонента TClientSocket | |
Active | Показатель того, открыт или закрыт сокет. Открыт – значение True, закрыт – значение False. Доступно для записи. |
Host | Хост-имя, с которым нужно соединиться |
Address | IP-адрес компьютера, с которым нужно соединиться. В отличие от Host, здесь может быть указан только IP. Разница состоит в том, что если в Host указано буквенное имя компьютера, то IP запросится у DNS |
Port | Номер порта компьютера, с которым нужно соединиться (1-65535) |
ClientType | Содержит тип передачи данных: ctBlocking — синхронная передача (OnRead и OnWrite не работают). Синхронный тип подключения подходит для поточного обмена данными; ctNonBlocking — асинхронная передача (отправка/приём данных может производиться при помощи событий OnRead и OnWrite) |
Основные методы компонента TClientSocket | |
Open | Открывает сокет (присвоение свойству Active значения True) |
Close | Закрывает сокет (присвоение свойству Active значения False) |
Основные события компонента TClientSocket | |
OnConnect | Возникает при установке подключения. В обработчике уже можно приступать к авторизации или отправке/приему данных |
OnConnecting | Также возникает при подключении. Отличается от OnConnect тем, что подключение еще не установлено. Чаще всего используется, например, чтобы обновить статус |
OnDisconnect | Событие возникает при закрытии сокета вашей программой, удаленным компьютером или из-за сбоя |
OnError | Событие возникает при ошибке. Во время открытия сокета это событие не поможет выловить ошибку. Во избежание появления сообщения от Windows об ошибке, лучше позаботиться о внутренней обработке исключений путём помещения операторов открытия в блок «try..except» |
OnLookup | Событие возникает при попытке получить IP-адрес от DNS |
OnRead | Событие возникает при отправке вам каких-либо данных удалённым компьютером. При вызове OnRead возможна обработка принятых данных |
OnWrite | Событие возникает, когда вашей программе разрешено писать данные в сокет |
Для приема или отправки данных необходимо использовать методы объекта TClientSocket.Socket:
— SendBuf(var Buf; Count: Integer) — Посылка буфера через сокет. Буфером может являться любой тип, будь то структура (record), либо простой Integer. Буфер указывается параметром Buf, вторым параметром Вы должны указать размер пересылаемых данных в байтах (Count);
— SendText(const S: string) — Посылка текстовой строки через сокет.
— SendStream(AStream: TStream) — Посылка содержимого указанного потока через сокет. Пересылаемый поток должен быть открыт. Поток может быть любого типа — файловый, из ОЗУ, и т.д.
— ReceiveBuf (var Buf; Count: Integer) — Прием данных в буфер Buf, размером Count. Важно знать, что при попытке чтения большего количества данных чем доступно на данный момент – возникнет ошибка чтения с сокета. Количество данных (в байтах), доступных для чтения с сокета, можно узнать в свойстве ReceiveLength.
Для чтения простых данных с сокета можно воспользоваться свойством ReceiveText.
Работа с серверными сокетами (TServerSocket)
Сервер, основанный на сокетах, позволяет обслуживать сразу множество клиентов. Причем, ограничение на их количество вы можете указать сами (или вообще убрать это ограничение, как это сделано по умолчанию). Для каждого подключенного клиента сервер открывает отдельный сокет, по которому Вы можете обмениваться данными с клиентом.
Основные этапы работы с TServerSocket
1) Определение свойств Port и ServerType— чтобы к серверу могли нормально подключаться клиенты, нужно, чтобы порт, используемый сервером точно совпадал с портом, используемым клиентом (и наоборот). Свойство ServerType определяет тип подключения (подробнее см.ниже);
2) Открытие сокета — открытие сокета и указанного порта. Здесь выполняется автоматическое начало ожидания подсоединения клиентов (Listen);
3) Подключение клиента и обмен данными с ним — здесь подключается клиент и идет обмен данными с ним.
4) Отключение клиента — Здесь клиент отключается и закрывается его сокетное соединение с сервером.
5) Закрытие сервера и сокета — По команде администратора сервер завершает свою работу, закрывая все открытые сокетные каналы и прекращая ожидание подключений клиентов.
Следует заметить, что пункты 3-4 повторяются многократно, т.е. эти пункты выполняются для каждого нового подключения клиента.
Основные свойства компонента TServerSocket | |
Socket | Класс TServerWinSocket, через который Вы имеете доступ к открытым сокетным каналам. Далее мы рассмотрим это свойство более подробно, т.к. оно, собственно и есть одно из главных. |
ServerType | Тип сервера. Может принимать одно из двух значений: stNonBlocking — синхронная работа с клиентскими сокетами. При таком типе сервера Вы можете работать с клиентами через события OnClientRead и OnClientWrite. stThreadBlocking — асинхронный тип. Для каждого клиентского сокетного канала создается отдельный процесс (Thread). |
ThreadCacheSize | Количество клиентских процессов (Thread), которые будут кэшироваться сервером. Здесь необходимо подбирать среднее значение в зависимости от загруженности Вашего сервера. Кэширование происходит для того, чтобы не создавать каждый раз отдельный процесс и не убивать закрытый сокет, а оставить их для дальнейшего использования. |
Active | Показатель того, активен в данных момент сервер, или нет. Т.е., фактически, значение True указывает на то, что сервер работает и готов к приему клиентов, а False — сервер выключен. Чтобы запустить сервер, нужно просто присвоить этому свойству значение True. |
Port | Номер порта для установления соединений с клиентами. Порт у сервера и у клиентов должны быть одинаковыми. Рекомендуются значения от 1025 до 65535, т.к. от 1 до 1024 — могут быть заняты системой. |
Основные методы компонента TServerSocket | |
Open | Запускает сервер. По сути, эта команда идентична присвоению значения True свойству Active |
Close | Останавливает сервер. По сути, эта команда идентична присвоению значения False свойству Active |
Основные события компонента TServerSocket | |
OnClientConnect | Возникает, когда клиент установил сокетное соединение и ждет ответа сервера (OnAccept) |
OnClientDisconnect | Возникает, когда клиент отсоединился от сокетного канала |
OnClientRead | Возникает, когда клиент передал серверу какие-либо данные. Доступ к этим данным можно получить через передаваемый параметр Socket: TCustomWinSocket |
OnClientWrite | Возникает, когда сервер может отправлять данные клиенту по сокету |
OnGetSocket | В обработчике этого события Вы можете отредактировать параметр ClientSocket |
OnGetThread | В обработчике этого события Вы можете определить уникальный процесс (Thread) для каждого отдельного клиентского канала, присвоив параметру SocketThread нужную подзадачу TServerClientThread |
OnThreadStart | Возникает, когда подзадача (процесс, Thread) запускается |
OnThreadEnd | Возникает, когда подзадача (процесс, Thread) останавливается |
OnAccept | Возникает, когда сервер принимает клиента или отказывает ему в соединении |
OnListen | Возникает, когда сервер переходит в режим ожидания подсоединения клиентов |
Пример работы сокетами
См. демонстрационные проекты в папках /lab1/tcp-ip-client/ и /lab1/tcp-ip-server/
| | следующая лекция ==> | |
Социально-педагогические технологии работы с семьей, воспитывающей ребенка с ограниченными возможностями | | | Скопируйте этот текст три раза |
Дата добавления: 2020-09-03 ; просмотров: 765 | Нарушение авторских прав
Простой способ отправки файлов при помощи tclientsocket & tserversocket
На вопрос «Как я могу отправлять файлы через TClientSocket & TServerSocket?» даём ответ:
Категория : Разные | Добавил : Барон (14.12.2011)
[ Пожертвования для сайта ] [ Пожаловаться на материал ]
Если вам помог материал сайта кликните по оплаченной рекламе размещенной в центре Как установить TClientSocket и TServerSocket для мультиплатформенности?В C ++ Builder, как я могу установить TClientSocket а также TServerSocket для использования в мультиплатформенном приложении? В настоящее время я использую их в проекте только для VCL. Решение
Это описано в документации Embarcadero:
Чтобы установить компоненты сокета: Примечание. Эти шаги являются одноразовыми инструкциями по установке. Компоненты сокетов должны быть доступны для всех будущих проектов. Что, как говорится…
TClientSocket а также TServerSocket НЕ являются мультиплатформенными компонентами. Они тесно связаны с библиотекой Microsoft WinSock под Windows и работают только в проектах VCL, а не в проектах FMX. Для работы с мультиплатформенными сокетами вы можете использовать Инди вместо этого, который предварительно установлен в RADStudio, или вы можете установить актуальная версия вручную. Простой способ отправки файлов при помощи tclientsocket & tserversocketuses type var procedure TForm1.Image1Click(Sender: TObject ); procedure TForm1.FormCreate(Sender: TObject ); procedure TForm1.ClientSocket1Connect(Sender: TObject ; procedure TForm1.ClientSocket1Read(Sender: TObject ; procedure TForm1.ServerSocket1ClientRead(Sender: TObject ;
|