Практика и примеры
Пример, в котором по сокету передаются и принимаются текстовые сообщения:
Пример 1. Посылка/прием текстовых сообщений по сокетам |
{... Здесь идет заголовок файла и определение формы TForm1 и ее экземпляра Form1} {В форму нужно поместить две кнопки TButton и три TEdit. При нажатии на первую кнопку вызывается обработчик события OnClick - Button1Click. Перед этим в первый из TEdit-ов нужно ввести хост-имя, а во второй - порт удаленного компьютера. После установления соединения можно посылать текстовые сообщения, вводя текст в третий TEdit и нажимая вторую кнопку TButton. Чтобы отсоединиться, нужно еще раз нажать первую TButton. Еще нужно добавить TListBox, в который будем помещать принятые и отправленные сообщения. НЕ ЗАБУДЬТЕ ПОМЕСТИТЬ В ФОРМУ КОМПОНЕНТ TClientSocket!} procedure Button1Click(Sender: TObject); begin {Если соединение уже установлено - прерываем его.} if ClientSocket1.Active then begin ClientSocket1.Close; Exit; {...и выходим из обработчика} end; {Присваиваем свойствам Host и Port нужные значения} ClientSocket1.Host := Edit1.Text; ClientSocket1.Port := StrToInt(Edit2.Text); {Пытаемся открыть сокет и установить соединение} ClientSocket1.Open; end; procedure ClientSocket1Connect(Sender: TObject; Socket: TCustomWinSocket); begin {Как только произошло соединение - посылаем приветствие} Socket.SendText('Hello!'); ListBox1.Items.Add('< Hello!'); end; procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket); begin {Если пришло сообщение - добавляем его в ListBox} ListBox1.Items.Add('> '+Socket.ReceiveText); end; procedure Button2Click(Sender: TObject); begin {Нажата кнопка - посылаем текст из третьего TEdit} ClientSocket1.Socket.SendText(Edit3.Text); ListBox1.Items.Add('< '+Edit3.Text); end; |
ПРИМЕЧАНИЕ: В некоторых случаях (зависящих от сервера) нужно после каждого сообщения посылать перевод строки: ClientSocket1.Socket.SendText(Edit3.Text+#10);
Посылка/прием сложных данных
Иногда необходимо пересылать по сети не только простые текстовые сообщения, но и сложные структуры (тип record в Паскале), или даже файлы. И тогда Вам необходимо использовать специальные операторы. Некоторые из них перечислены ниже:
Методы TClientSocket.Socket:
SendBuf(var Buf; Count: Integer) - Посылка буфера через сокет. Буфером может являться любой тип, будь то структура (record), либо простой Integer. Буфер указывается параметром Buf, вторым параметром Вы должны указать размер пересылаемых данных в байтах (Count);
SendText(const S: string) - Посылка текстовой строки через сокет. Этот метод рассматривался в примере 2 (см.выше);
SendStream(AStream: TStream) - Посылка содержимого указанного потока через сокет. Пересылаемый поток должен быть открыт. Поток может быть любого типа - файловый, из ОЗУ, и т.д. Описание работы непосредственно с потоками выходит за рамки данной статьи;